P1531 I Hate It
# include <bits/stdc++.h>
using namespace std;
const int SIZE = 2e5 + 5 ;
int t[ SIZE<< 2 ] , a[ SIZE] ;
int n, m;
void pushup ( int i) {
t[ i] = max ( t[ i<< 1 ] , t[ i<< 1 | 1 ] ) ;
}
void build ( int i, int l, int r) {
if ( l== r) {
t[ i] = a[ l] ;
return ;
}
int mid= ( l+ r) >> 1 ;
build ( i<< 1 , l, mid) ;
build ( i<< 1 | 1 , mid+ 1 , r) ;
pushup ( i) ;
}
int query ( int ql, int qr, int l, int r, int i) {
if ( ql<= l && r <= qr) {
return t[ i] ;
}
int mid = ( l+ r) >> 1 ;
int result = 0 ;
if ( ql <= mid) {
result = max ( result, query ( ql, qr, l, mid, i<< 1 ) ) ;
}
if ( qr > mid) {
result = max ( result, query ( ql, qr, mid+ 1 , r, i<< 1 | 1 ) ) ;
}
return result;
}
void update ( int p, int l, int r, int i, int v) {
if ( l== r) {
if ( t[ i] < v) {
t[ i] = v;
}
return ;
}
int mid= ( l+ r) >> 1 ;
if ( p <= mid) {
update ( p, l, mid, i<< 1 , v) ;
}
if ( p > mid) {
update ( p, mid+ 1 , r, i<< 1 | 1 , v) ;
}
pushup ( i) ;
}
int main ( ) {
cin>> n>> m;
for ( int i= 1 ; i<= n; i++ ) {
cin>> a[ i] ;
}
build ( 1 , 1 , n) ;
while ( m-- ) {
char op; int a, b;
cin>> op>> a>> b;
if ( op== 'Q' ) {
cout<< query ( a, b, 1 , n, 1 ) << endl;
}
else {
update ( a, 1 , n, 1 , b) ;
}
}
return 0 ;
}
P1198 [JSOI2008]最大数 | BZOJ1012 [JSOI2008]最大数maxnumber
# include <bits/stdc++.h>
# define int long long
using namespace std;
int t[ 800005 ] ;
int m, d;
char op;
int x, tt, cnt;
void pushup ( int i) {
t[ i] = max ( t[ i<< 1 ] , t[ i<< 1 | 1 ] ) % d;
}
void update ( int pv, int v, int i, int l, int r) {
if ( l== r) {
t[ i] = v;
return ;
}
int mid= ( l+ r) >> 1 ;
if ( mid>= pv) {
update ( pv, v, i<< 1 , l, mid) ;
}
if ( mid< pv) {
update ( pv, v, i<< 1 | 1 , mid+ 1 , r) ;
}
pushup ( i) ;
}
int ask ( int ql, int qr, int i, int l, int r) {
if ( ql<= l&& qr>= r) {
return t[ i] ;
}
int mid= ( l+ r) >> 1 ;
int result= LLONG_MIN;
if ( ql<= mid) {
result= max ( result, ask ( ql, qr, i<< 1 , l, mid) ) ;
}
if ( qr> mid) {
result= max ( result, ask ( ql, qr, i<< 1 | 1 , mid+ 1 , r) ) ;
}
return result;
}
signed main ( ) {
cin>> m>> d;
for ( int i= 1 ; i<= m; i++ ) {
cin>> op>> x;
if ( op== 'A' ) {
update ( cnt+ 1 , ( x+ tt) % d, 1 , 1 , m) ;
cnt++ ;
}
else {
if ( x== 0 ) tt= 0 ;
else tt= ask ( cnt- x+ 1 , cnt, 1 , 1 , m) % d;
cout<< tt<< endl;
}
}
return 0 ;
}
P2880 [USACO07JAN] Balanced Lineup G
# include <bits/stdc++.h>
using namespace std;
int n, q, a[ 1000005 ] ;
int maxn[ 1000005 << 2 ] , minn[ 1000005 << 2 ] ;
bool flag = true ;
void pushup ( int i) {
maxn[ i] = max ( maxn[ i << 1 ] , maxn[ i << 1 | 1 ] ) ;
minn[ i] = min ( minn[ i << 1 ] , minn[ i << 1 | 1 ] ) ;
}
void build ( int i, int l, int r) {
if ( l == r) {
maxn[ i] = minn[ i] = a[ l] ;
return ;
}
int mid = ( l + r) >> 1 ;
build ( i << 1 , l, mid) ;
build ( i << 1 | 1 , mid + 1 , r) ;
pushup ( i) ;
}
int querymax ( int L, int R, int l, int r, int i) {
if ( L <= l && r <= R) {
return maxn[ i] ;
}
int mid = ( l + r) >> 1 ;
int result = INT_MIN;
if ( L <= mid) {
result = max ( result, querymax ( L, R, l, mid, i << 1 ) ) ;
}
if ( R > mid) {
result = max ( result, querymax ( L, R, mid + 1 , r, i << 1 | 1 ) ) ;
}
return result;
}
int querymin ( int L, int R, int l, int r, int i) {
if ( L <= l && r <= R) {
return minn[ i] ;
}
int mid = ( l + r) >> 1 ;
int result = INT_MAX;
if ( L <= mid) {
result = min ( result, querymin ( L, R, l, mid, i << 1 ) ) ;
}
if ( R > mid) {
result = min ( result, querymin ( L, R, mid + 1 , r, i << 1 | 1 ) ) ;
}
return result;
}
int main ( ) {
ios:: sync_with_stdio ( false ) ;
cin. tie ( 0 ) ;
cout. tie ( 0 ) ;
cin >> n >> q;
for ( int i = 1 ; i <= n; i++ ) {
cin >> a[ i] ;
}
build ( 1 , 1 , n) ;
while ( q-- ) {
int l, r;
cin>> l>> r;
cout<< querymax ( l, r, 1 , n, 1 ) - querymin ( l, r, 1 , n, 1 ) << endl;
}
return 0 ;
}
P4392 [BOI2007]Sound 静音问题
# include <bits/stdc++.h>
using namespace std;
int n, m, c, a[ 1000005 ] ;
int maxn[ 1000005 << 2 ] , minn[ 1000005 << 2 ] ;
bool flag = true ;
void pushup ( int i) {
maxn[ i] = max ( maxn[ i << 1 ] , maxn[ i << 1 | 1 ] ) ;
minn[ i] = min ( minn[ i << 1 ] , minn[ i << 1 | 1 ] ) ;
}
void build ( int i, int l, int r) {
if ( l == r) {
maxn[ i] = minn[ i] = a[ l] ;
return ;
}
int mid = ( l + r) >> 1 ;
build ( i << 1 , l, mid) ;
build ( i << 1 | 1 , mid + 1 , r) ;
pushup ( i) ;
}
int querymax ( int L, int R, int l, int r, int i) {
if ( L <= l && r <= R) {
return maxn[ i] ;
}
int mid = ( l + r) >> 1 ;
int result = INT_MIN;
if ( L <= mid) {
result = max ( result, querymax ( L, R, l, mid, i << 1 ) ) ;
}
if ( R > mid) {
result = max ( result, querymax ( L, R, mid + 1 , r, i << 1 | 1 ) ) ;
}
return result;
}
int querymin ( int L, int R, int l, int r, int i) {
if ( L <= l && r <= R) {
return minn[ i] ;
}
int mid = ( l + r) >> 1 ;
int result = INT_MAX;
if ( L <= mid) {
result = min ( result, querymin ( L, R, l, mid, i << 1 ) ) ;
}
if ( R > mid) {
result = min ( result, querymin ( L, R, mid + 1 , r, i << 1 | 1 ) ) ;
}
return result;
}
int main ( ) {
ios:: sync_with_stdio ( false ) ;
cin. tie ( 0 ) ;
cout. tie ( 0 ) ;
cin >> n >> m >> c;
for ( int i = 1 ; i <= n; i++ ) {
cin >> a[ i] ;
}
build ( 1 , 1 , n) ;
for ( int i = 1 ; i <= n - m + 1 ; i++ ) {
if ( ( querymax ( i, i + m - 1 , 1 , n, 1 ) - querymin ( i, i + m - 1 , 1 , n, 1 ) ) <= c) {
cout << i << endl;
flag = false ;
}
}
if ( flag) {
cout << "NONE" << endl;
}
return 0 ;
}
P1253 [yLOI2018] 扶苏的问题
# include <bits/stdc++.h>
# define ls ( i<< 1 )
# define rs ( i<< 1 | 1 )
# define mid ( ( l+ r) >> 1 )
# define int long long
using namespace std;
struct node {
int maxv, add, cov;
node ( ) {
this -> cov = LLONG_MIN;
this -> add = 0 ;
}
} t[ 4000005 ] ;
int a[ 1000005 ] ;
int n, q;
inline void pushup ( int i) {
t[ i] . maxv= max ( t[ ls] . maxv, t[ rs] . maxv) ;
}
void build ( int i, int l, int r) {
if ( l== r) {
t[ i] . maxv= a[ l] ;
}
else {
build ( ls, l, mid) ;
build ( rs, mid+ 1 , r) ;
pushup ( i) ;
}
}
void pushdown ( int i) {
if ( t[ i] . cov!= LLONG_MIN) {
t[ ls] . maxv= t[ rs] . maxv= t[ ls] . cov= t[ rs] . cov= t[ i] . cov;
t[ ls] . add= t[ rs] . add= 0 ;
t[ i] . cov= LLONG_MIN;
}
if ( t[ i] . add) {
t[ ls] . add+= t[ i] . add;
t[ rs] . add+= t[ i] . add;
t[ ls] . maxv+= t[ i] . add;
t[ rs] . maxv+= t[ i] . add;
t[ i] . add= 0 ;
}
}
void add ( int ql, int qr, int v, int i, int l, int r) {
if ( ql<= l&& r<= qr) {
t[ i] . maxv+= v;
t[ i] . add+= v;
return ;
}
pushdown ( i) ;
if ( ql<= mid) {
add ( ql, qr, v, ls, l, mid) ;
}
if ( mid< qr) {
add ( ql, qr, v, rs, mid+ 1 , r) ;
}
pushup ( i) ;
}
void cover ( int ql, int qr, int v, int i, int l, int r) {
if ( ql<= l&& r<= qr) {
t[ i] . maxv= v;
t[ i] . cov= v;
t[ i] . add= 0 ;
return ;
}
pushdown ( i) ;
if ( ql<= mid) {
cover ( ql, qr, v, ls, l, mid) ;
}
if ( mid< qr) {
cover ( ql, qr, v, rs, mid+ 1 , r) ;
}
pushup ( i) ;
}
int query ( int ql, int qr, int i, int l, int r) {
if ( ql<= l&& r<= qr) {
return t[ i] . maxv;
}
pushdown ( i) ;
int result= LLONG_MIN;
if ( ql<= mid) {
result= max ( result, query ( ql, qr, ls, l, mid) ) ;
}
if ( mid< qr) {
result= max ( result, query ( ql, qr, rs, mid+ 1 , r) ) ;
}
return result;
}
signed main ( ) {
cin>> n>> q;
for ( int i= 1 ; i<= n; i++ ) {
cin>> a[ i] ;
}
build ( 1 , 1 , n) ;
while ( q-- ) {
int op, l, r, x;
cin>> op;
if ( op== 2 ) {
cin>> l>> r>> x;
add ( l, r, x, 1 , 1 , n) ;
}
if ( op== 1 ) {
cin>> l>> r>> x;
cover ( l, r, x, 1 , 1 , n) ;
}
if ( op== 3 ) {
cin>> l>> r;
cout<< query ( l, r, 1 , 1 , n) << endl;
}
}
return 0 ;
}
P2023 [AHOI2009] 维护序列 | LibreOJ#10129. 「一本通 4.3 练习 3」维护序列
# include <bits/stdc++.h>
using namespace std;
long long c[ 500010 ] ;
long long p;
struct sgt {
long long sum[ 2000010 ] ;
long long addv[ 2000010 ] ;
long long mulv[ 2000010 ] ;
void build ( int o, int l, int r) {
addv[ o] = 0 ;
mulv[ o] = 1 ;
if ( l== r) sum[ o] = c[ l] ;
else {
int mid= ( l+ r) >> 1 ;
int lson= o<< 1 ;
int rson= lson| 1 ;
build ( lson, l, mid) ;
build ( rson, mid+ 1 , r) ;
sum[ o] = ( sum[ lson] + sum[ rson] ) % p;
}
}
void push_down ( int o, int l, int r, int mid, int lson, int rson) {
mulv[ lson] = ( mulv[ lson] * mulv[ o] ) % p;
mulv[ rson] = ( mulv[ rson] * mulv[ o] ) % p;
addv[ lson] = ( addv[ lson] * mulv[ o] ) % p;
addv[ rson] = ( addv[ rson] * mulv[ o] ) % p;
sum[ lson] = ( sum[ lson] * mulv[ o] ) % p;
sum[ rson] = ( sum[ rson] * mulv[ o] ) % p;
mulv[ o] = 1 ;
addv[ lson] = ( addv[ lson] + addv[ o] ) % p;
addv[ rson] = ( addv[ rson] + addv[ o] ) % p;
sum[ lson] = ( sum[ lson] + ( mid- l+ 1 ) * addv[ o] ) % p;
sum[ rson] = ( sum[ rson] + ( r- mid) * addv[ o] ) % p;
addv[ o] = 0 ;
}
void addall ( int o, int l, int r, int a, int b, int x) {
if ( l>= a && r<= b) {
addv[ o] = ( addv[ o] + x) % p;
sum[ o] = ( sum[ o] + ( r- l+ 1 ) * x) % p;
return ;
}
else {
int mid= ( l+ r) >> 1 ;
int lson= o<< 1 ;
int rson= lson| 1 ;
if ( mulv[ o] != 1 || addv[ o] ) push_down ( o, l, r, mid, lson, rson) ;
if ( a<= mid) addall ( lson, l, mid, a, b, x) ;
if ( b> mid) addall ( rson, mid+ 1 , r, a, b, x) ;
sum[ o] = ( sum[ lson] + sum[ rson] ) % p;
}
}
void mulall ( int o, int l, int r, int a, int b, int x) {
if ( l>= a && r<= b) {
mulv[ o] = ( mulv[ o] * x) % p;
addv[ o] = ( addv[ o] * x) % p;
sum[ o] = ( sum[ o] * x) % p;
return ;
}
else {
int mid= ( l+ r) >> 1 ;
int lson= o<< 1 ;
int rson= lson| 1 ;
if ( mulv[ o] != 1 || addv[ o] ) push_down ( o, l, r, mid, lson, rson) ;
if ( a<= mid) mulall ( lson, l, mid, a, b, x) ;
if ( b> mid) mulall ( rson, mid+ 1 , r, a, b, x) ;
sum[ o] = ( sum[ lson] + sum[ rson] ) % p;
}
}
long long query ( int o, int l, int r, int a, int b) {
if ( l>= a && r<= b) return sum[ o] % p;
else {
int mid= ( l+ r) >> 1 ;
int lson= o<< 1 ;
int rson= lson| 1 ;
long long ans= 0 ;
if ( mulv[ o] != 1 || addv[ o] ) push_down ( o, l, r, mid, lson, rson) ;
if ( a<= mid) ans+= query ( lson, l, mid, a, b) ;
if ( b> mid) ans+= query ( rson, mid+ 1 , r, a, b) ;
return ans% p;
}
}
} tree;
signed main ( ) {
ios:: sync_with_stdio ( false ) ;
cin. tie ( 0 ) ;
int n, m;
cin>> n>> p;
for ( int i= 1 ; i<= n; i++ ) {
cin>> c[ i] ;
}
cin>> m;
tree. build ( 1 , 1 , n) ;
for ( int i= 1 ; i<= m; i++ ) {
int f;
long long x, y, k;
cin>> f;
if ( f== 1 ) {
cin>> x>> y>> k;
tree. mulall ( 1 , 1 , n, x, y, k) ;
}
else if ( f== 2 ) {
cin>> x>> y>> k;
tree. addall ( 1 , 1 , n, x, y, k) ;
}
else {
cin>> x>> y;
cout<< tree. query ( 1 , 1 , n, x, y) << endl;
}
}
return 0 ;
}
CodeForces718C Sasha and Array
# include <bits/stdc++.h>
# define ls ( i<< 1 )
# define rs ( i<< 1 | 1 )
# define mid ( ( l+ r) >> 1 )
# define int long long
using namespace std;
const int MOD = 1e9 + 7 ;
struct Matrix {
int a[ 3 ] [ 3 ] ;
const int size = 2 ;
Matrix ( ) {
memset ( a, 0 , sizeof ( a) ) ;
}
Matrix ( int aba) {
a[ aba] [ aba] = 1 ;
a[ aba] [ aba+ 1 ] = 0 ;
a[ aba+ 1 ] [ aba] = 0 ;
a[ aba+ 1 ] [ aba+ 1 ] = 1 ;
}
Matrix ( int A, int b, int c, int d) {
a[ 1 ] [ 1 ] = A;
a[ 1 ] [ 2 ] = b;
a[ 2 ] [ 1 ] = c;
a[ 2 ] [ 2 ] = d;
}
Matrix operator * ( const Matrix & ano) const {
Matrix ans;
for ( int i= 1 ; i<= size; i++ ) {
for ( int k= 1 ; k<= size; k++ ) {
for ( int j= 1 ; j<= size; j++ ) {
ans. a[ i] [ k] = ( ans. a[ i] [ k] + a[ i] [ j] * ano. a[ j] [ k] ) % MOD;
}
}
}
return ans;
}
Matrix operator + ( const Matrix aa) {
Matrix res;
for ( int i= 1 ; i<= size; i++ ) {
for ( int j= 1 ; j<= size; j++ ) {
res. a[ i] [ j] = a[ i] [ j] + aa. a[ i] [ j] ;
res. a[ i] [ j] %= MOD;
}
}
return res;
}
void operator = ( const Matrix A) {
for ( int i= 1 ; i<= size; i++ ) {
for ( int j= 1 ; j<= size; j++ ) {
a[ i] [ j] = A. a[ i] [ j] ;
}
}
}
bool empty ( ) {
return ( a[ 1 ] [ 1 ] == 0 ) && ( a[ 1 ] [ 2 ] == 0 ) && ( a[ 2 ] [ 1 ] == 0 ) && ( a[ 2 ] [ 2 ] == 0 ) ;
}
Matrix operator ^ ( int power) {
Matrix res ( 1 ) ;
Matrix base = ( * this ) ;
while ( power) {
if ( power& 1 ) {
res= res* base;
}
base= base* base;
power>>= 1 ;
}
return res;
}
} ;
const int SIZE = 1e5 + 5 ;
Matrix t[ SIZE<< 2 ] , tag[ SIZE<< 2 ] ;
int v[ SIZE] ;
const Matrix unit ( 1 ) ;
int n, m;
inline void pushup ( int i) {
t[ i] = t[ ls] + t[ rs] ;
}
void build ( int i, int l, int r) {
tag[ i] = unit;
if ( l== r) {
t[ i] = Matrix ( 1 , 1 , 0 , 0 ) * ( Matrix ( 1 , 1 , 1 , 0 ) ^ ( v[ l] - 1 ) ) ;
return ;
}
build ( ls, l, mid) ;
build ( rs, mid+ 1 , r) ;
pushup ( i) ;
}
void pushdown ( int i) {
if ( tag[ i] . empty ( ) ) {
return ;
}
t[ ls] = t[ ls] * tag[ i] ;
tag[ ls] = tag[ ls] * tag[ i] ;
t[ rs] = t[ rs] * tag[ i] ;
tag[ rs] = tag[ rs] * tag[ i] ;
tag[ i] = unit;
}
void update ( int i, int ql, int qr, int l, int r, Matrix x) {
if ( ql<= l && qr>= r) {
t[ i] = t[ i] * x;
tag[ i] = tag[ i] * x;
return ;
}
pushdown ( i) ;
if ( ql<= mid) {
update ( ls, ql, qr, l, mid, x) ;
}
if ( qr> mid) {
update ( rs, ql, qr, mid+ 1 , r, x) ;
}
pushup ( i) ;
}
Matrix query ( int i, int ql, int qr, int l, int r) {
if ( ql<= l && qr>= r) {
return t[ i] ;
}
pushdown ( i) ;
Matrix res;
if ( ql<= mid) {
res = res + query ( ls, ql, qr, l, mid) ;
}
if ( qr > mid) {
res = res+ query ( rs, ql, qr, mid+ 1 , r) ;
}
return res;
}
signed main ( ) {
cin>> n>> m;
for ( int i= 1 ; i<= n; i++ ) {
cin>> v[ i] ;
}
build ( 1 , 1 , n) ;
while ( m-- ) {
int op, l, r, x;
cin>> op;
if ( op== 1 ) {
cin>> l>> r>> x;
update ( 1 , l, r, 1 , n, Matrix ( 1 , 1 , 1 , 0 ) ^ x) ;
}
else {
cin>> l>> r;
cout<< ( query ( 1 , l, r, 1 , n) . a[ 1 ] [ 2 ] % MOD) << '\n' ;
}
}
return 0 ;
}
P1438 无聊的数列
# include <bits/stdc++.h>
# define ls ( i<< 1 )
# define rs ( i<< 1 | 1 )
# define mid ( ( l+ r) >> 1 )
# define int long long
using namespace std;
const int SIZE = 1e5 + 5 ;
struct LMY08 {
int sum, tag;
LMY08 ( ) {
sum= tag= 0 ;
}
} t[ SIZE<< 2 ] ;
int a[ SIZE] ;
int n, m;
void pushup ( int i) {
t[ i] . sum = t[ ls] . sum+ t[ rs] . sum;
}
void build ( int i, int l, int r) {
if ( l== r) {
t[ i] . sum = a[ l] ;
return ;
}
build ( ls, l, mid) ;
build ( rs, mid+ 1 , r) ;
pushup ( i) ;
}
void pushdown ( int i, int l, int r) {
t[ ls] . tag+= t[ i] . tag;
t[ rs] . tag+= t[ i] . tag;
t[ ls] . sum+= t[ i] . tag* ( mid- l+ 1 ) ;
t[ rs] . sum+= t[ i] . tag* ( r- mid) ;
t[ i] . tag= 0 ;
}
void update ( int ql, int qr, int x, int i, int l, int r) {
if ( ql<= l&& r<= qr) {
t[ i] . tag+= x;
t[ i] . sum+= ( r- l+ 1 ) * x;
return ;
}
pushdown ( i, l, r) ;
if ( ql<= mid) {
update ( ql, qr, x, ls, l, mid) ;
}
if ( qr> mid) {
update ( ql, qr, x, rs, mid+ 1 , r) ;
}
pushup ( i) ;
}
int query ( int ql, int qr, int i, int l, int r) {
if ( ql<= l&& r<= qr) {
return t[ i] . sum;
}
int result= 0 ;
pushdown ( i, l, r) ;
if ( ql<= mid) {
result+= query ( ql, qr, ls, l, mid) ;
}
if ( qr> mid) {
result+= query ( ql, qr, rs, mid+ 1 , r) ;
}
return result;
}
signed main ( ) {
cin>> n>> m;
for ( int i= 1 ; i<= n; i++ ) {
cin>> a[ i] ;
}
for ( int i= n- 1 ; i> 0 ; i-- ) {
a[ i+ 1 ] -= a[ i] ;
}
build ( 1 , 1 , n) ;
while ( m-- ) {
int opt;
cin>> opt;
if ( opt== 1 ) {
int l, r, k, d;
cin>> l>> r>> k>> d;
update ( l, l, k, 1 , 1 , n) ;
if ( l+ 1 <= r) {
update ( l+ 1 , r, d, 1 , 1 , n) ;
}
if ( r< n) {
update ( r+ 1 , r+ 1 , - ( k+ d* ( r- l) ) , 1 , 1 , n) ;
}
} else {
int p;
cin>> p;
cout<< query ( 1 , p, 1 , 1 , n) << '\n' ;
}
}
return 0 ;
}
P4145 上帝造题的七分钟 2 / 花神游历各国 | LibreOJ#6281. 数列分块入门 5
# include <bits/stdc++.h>
# define ls ( i) ( i<< 1 )
# define rs ( i) ( i<< 1 | 1 )
# define mid ( l, r) ( ( l+ r) >> 1 )
using namespace std;
const int SIZE= 100010 ;
# define int long long
int n, m;
int a[ SIZE* 4 ] , tag[ SIZE* 4 ] ;
inline void pushup ( int t) {
a[ t] = a[ ls ( t) ] + a[ rs ( t) ] ;
tag[ t] = max ( tag[ ls ( t) ] , tag[ rs ( t) ] ) ;
}
void build ( int l= 1 , int r= n, int t= 1 ) {
if ( l== r) {
cin>> a[ t] ;
tag[ t] = a[ t] ;
return ;
}
build ( l, mid ( l, r) , ls ( t) ) ;
build ( mid ( l, r) + 1 , r, rs ( t) ) ;
pushup ( t) ;
}
void update ( int L, int R, int l= 1 , int r= n, int t= 1 ) {
if ( R< l|| L> r) return ;
if ( tag[ t] == 1 ) return ;
if ( l== r) {
tag[ t] = a[ t] = ( int ) sqrt ( a[ t] ) ;
return ;
}
update ( L, R, l, mid ( l, r) , ls ( t) ) ;
update ( L, R, mid ( l, r) + 1 , r, rs ( t) ) ;
pushup ( t) ;
}
int ask ( int L, int R, int l= 1 , int r= n, int t= 1 ) {
if ( l>= L&& r<= R) {
return a[ t] ;
}
int ret= 0 ;
if ( mid ( l, r) >= L) ret+= ask ( L, R, l, mid ( l, r) , ls ( t) ) ;
if ( mid ( l, r) < R) ret+= ask ( L, R, mid ( l, r) + 1 , r, rs ( t) ) ;
return ret;
}
signed main ( ) {
cin>> n;
build ( ) ;
cin>> m;
while ( m-- ) {
int k, l, r;
cin>> k>> l>> r;
if ( l> r) swap ( l, r) ;
if ( k== 0 ) {
update ( l, r) ;
} else {
cout<< ask ( l, r) << '\n' ;
}
}
return 0 ;
}
T218729 mod板 线段树
# include <bits/stdc++.h>
# define int long long
# define ls ( now<< 1 )
# define rs ( now<< 1 | 1 )
# define mid ( l+ r>> 1 )
# define MAX ( a, b) ( a> b? a: b)
using namespace std;
int n, m;
int a[ 100001 ] ;
int tree[ 100001 << 2 ] , maxn[ 100001 << 2 ] ;
inline void pushup ( int now) {
tree[ now] = tree[ ls] + tree[ rs] ;
maxn[ now] = MAX ( maxn[ ls] , maxn[ rs] ) ;
}
void build ( int now, int l, int r) {
if ( l== r) {
tree[ now] = maxn[ now] = a[ l] ;
return ;
}
build ( ls, l, mid) ;
build ( rs, mid+ 1 , r) ;
pushup ( now) ;
}
void update_mod ( int now, int l, int r, int x, int y, int mod) {
if ( maxn[ now] < mod) return ;
if ( l== r) {
tree[ now] %= mod;
maxn[ now] %= mod;
return ;
}
if ( mid>= x) {
update_mod ( ls, l, mid, x, y, mod) ;
}
if ( mid< y) {
update_mod ( rs, mid+ 1 , r, x, y, mod) ;
}
pushup ( now) ;
}
void update_assign ( int now, int l, int r, int x, int k) {
if ( l== r) {
tree[ now] = maxn[ now] = k;
return ;
}
if ( mid>= x) {
update_assign ( ls, l, mid, x, k) ;
}
else {
update_assign ( rs, mid+ 1 , r, x, k) ;
}
pushup ( now) ;
}
void update_sqrt ( int now, int l, int r, int x, int y) {
if ( l== r) {
maxn[ now] = tree[ now] = sqrt ( tree[ now] ) ;
return ;
}
if ( mid>= x&& maxn[ ls] > 1 ) {
update_sqrt ( ls, l, mid, x, y) ;
}
if ( mid< y&& maxn[ rs] > 1 ) {
update_sqrt ( rs, mid+ 1 , r, x, y) ;
}
pushup ( now) ;
}
int query ( int now, int l, int r, int x, int y) {
if ( l>= x&& r<= y) {
return tree[ now] ;
}
int ret= 0 ;
if ( mid>= x) {
ret+= query ( ls, l, mid, x, y) ;
}
if ( mid< y) {
ret+= query ( rs, mid+ 1 , r, x, y) ;
}
return ret;
}
signed main ( ) {
cin>> n;
for ( int i= 1 ; i<= n; i++ ) cin>> a[ i] ;
cin>> m;
build ( 1 , 1 , n) ;
while ( m-- ) {
int op, l, r, k;
cin>> op;
if ( op== 1 ) {
cin>> l>> r;
cout<< query ( 1 , 1 , n, l, r) << endl;
}
if ( op== 2 ) {
cin>> l>> r;
update_sqrt ( 1 , 1 , n, l, r) ;
}
if ( op== 3 ) {
cin>> l>> r>> k;
update_mod ( 1 , 1 , n, l, r, k) ;
}
if ( op== 4 ) {
cin>> l>> k;
update_assign ( 1 , 1 , n, l, k) ;
}
}
}
P1801 黑匣子
# include <bits/stdc++.h>
# define ls ( i<< 1 )
# define rs ( i<< 1 | 1 )
# define mid ( ( l+ r) >> 1 )
using namespace std;
int c = 1 ;
const int SIZE = 2e6 + 5 ;
int t[ SIZE << 2 ] ;
struct node {
int v, id;
bool operator < ( const node ano) const {
return v < ano. v;
}
} a[ SIZE] ;
int u[ SIZE] ;
int mm[ SIZE] ;
int m, n, cnt, I = 1 ;
void pushup ( int i) {
t[ i] = t[ ls] + t[ rs] ;
}
void update ( int p, int i, int l, int r) {
if ( l == r && l == p) {
t[ i] ++ ;
return ;
}
t[ i] ++ ;
if ( p <= mid) {
update ( p, ls, l, mid) ;
} else {
update ( p, rs, mid + 1 , r) ;
}
pushup ( i) ;
}
int query ( int p, int i, int l, int r) {
if ( l == r) {
return l;
}
if ( t[ ls] >= p) {
return query ( p, ls, l, mid) ;
} else {
return query ( p - t[ ls] , rs, mid + 1 , r) ;
}
}
int main ( ) {
ios:: sync_with_stdio ( false ) ;
cin. tie ( 0 ) ;
cout. tie ( 0 ) ;
cin >> m >> n;
for ( int i = 1 ; i <= m; i++ ) {
cin >> a[ i] . v;
a[ i] . id = i;
}
sort ( a + 1 , a + m + 1 ) ;
for ( int i = 1 ; i <= m; i++ ) {
mm[ a[ i] . id] = i;
}
for ( int i = 1 ; i <= n; i++ ) cin >> u[ i] ;
for ( int i = 1 ; i <= m; i++ ) {
update ( mm[ i] , 1 , 1 , m) ;
while ( u[ c] == i) {
cout << a[ query ( I, 1 , 1 , m) ] . v << '\n' ;
I++ ;
c++ ;
}
}
return 0 ;
}
P3919 【模板】可持久化线段树 1(可持久化数组)
# include <bits/stdc++.h>
# define ls ( i<< 1 )
# define rs ( i<< 1 | 1 )
# define mid ( ( l+ r) >> 1 )
using namespace std;
const int SIZE = 1e6 + 5 ;
struct {
int l, r, v;
} t[ SIZE* 25 ] ;
int top;
int root[ SIZE* 25 ] ;
int a[ SIZE] ;
int n, m;
int newnode ( int i) {
t[ ++ top] = t[ i] ;
return top;
}
int build ( int i, int l, int r) {
i= ( ++ top) ;
if ( l== r) {
t[ i] . v= a[ l] ;
return i;
}
t[ i] . l= build ( t[ i] . l, l, mid) ;
t[ i] . r= build ( t[ i] . r, mid+ 1 , r) ;
return i;
}
int update ( int i, int l, int r, int p, int val) {
i= newnode ( i) ;
if ( l== r) {
t[ i] . v= val;
return i;
}
if ( p<= mid) {
t[ i] . l= update ( t[ i] . l, l, mid, p, val) ;
}
else {
t[ i] . r= update ( t[ i] . r, mid+ 1 , r, p, val) ;
}
return i;
}
int query ( int i, int l, int r, int p) {
if ( l== r) {
return t[ i] . v;
}
if ( p<= mid) {
return query ( t[ i] . l, l, mid, p) ;
}
else {
return query ( t[ i] . r, mid+ 1 , r, p) ;
}
}
inline void Assign ( int i, int version, int p, int val) {
root[ i] = update ( root[ version] , 1 , n, p, val) ;
}
inline int Get ( int i, int version, int p) {
root[ i] = root[ version] ;
return query ( root[ version] , 1 , n, p) ;
}
int main ( ) {
ios:: sync_with_stdio ( false ) ;
cin. tie ( 0 ) ;
cout. tie ( 0 ) ;
cin>> n>> m;
for ( int i= 1 ; i<= n; i++ ) {
cin>> a[ i] ;
}
root[ 0 ] = build ( 0 , 1 , n) ;
for ( int i= 1 , vi, op, loci, valuei; i<= m; i++ ) {
cin>> vi>> op>> loci;
if ( op== 1 ) {
cin>> valuei;
Assign ( i, vi, loci, valuei) ;
}
else {
cout<< Get ( i, vi, loci) << '\n' ;
}
}
return 0 ;
}
P3834 【模板】可持久化线段树 2
# include <bits/stdc++.h>
# define ls ( i<< 1 )
# define rs ( i<< 1 | 1 )
# define mid ( ( l+ r) >> 1 )
using namespace std;
const int SIZE = 2e5 + 5 ;
struct ArckaAKIOI {
int l, r, v;
ArckaAKIOI ( ) {
l= 0 , r= 0 , v= 0 ;
}
} t[ SIZE* 32 ] ;
int top;
int root[ SIZE] ;
int a[ SIZE] , b[ SIZE] ;
int n, m;
int newnode ( int i) {
t[ ++ top] = t[ i] ;
return top;
}
int build ( int i, int l, int r) {
i= ( ++ top) ;
if ( l== r) {
t[ i] . v= a[ l] ;
return i;
}
t[ i] . l= build ( t[ i] . l, l, mid) ;
t[ i] . r= build ( t[ i] . r, mid+ 1 , r) ;
return i;
}
int update ( int i, int l, int r, int p, int val) {
i= newnode ( i) ;
t[ i] . v++ ;
if ( l== r) {
return i;
}
if ( p<= mid) {
t[ i] . l= update ( t[ i] . l, l, mid, p, val) ;
}
else {
t[ i] . r= update ( t[ i] . r, mid+ 1 , r, p, val) ;
}
return i;
}
int query ( int i, int l, int r, int ql, int qr) {
if ( l== r) {
return l;
}
int delta = t[ t[ qr] . l] . v- t[ t[ ql] . l] . v;
if ( delta>= i) {
return query ( i, l, mid, t[ ql] . l, t[ qr] . l) ;
}
else {
return query ( i- delta, mid+ 1 , r, t[ ql] . r, t[ qr] . r) ;
}
}
int kkksc03;
void discretization ( ) {
for ( int i= 1 ; i<= n; i++ ) {
b[ i] = a[ i] ;
}
sort ( b+ 1 , b+ 1 + n) ;
kkksc03 = unique ( b+ 1 , b+ n+ 1 ) - ( b+ 1 ) ;
root[ 0 ] = build ( 0 , 1 , kkksc03) ;
for ( int i= 1 ; i<= n; i++ ) {
root[ i] = update ( root[ i- 1 ] , 1 , kkksc03, lower_bound ( b+ 1 , b+ kkksc03+ 1 , a[ i] ) - b, 114514 ) ;
}
}
int main ( ) {
cin>> n>> m;
for ( int i= 1 ; i<= n; i++ ) {
cin>> a[ i] ;
}
discretization ( ) ;
while ( m-- ) {
int l, r, k;
cin>> l>> r>> k;
cout<< b[ query ( k, 1 , kkksc03, root[ l- 1 ] , root[ r] ) ] << '\n' ;
}
return 0 ;
}
SP3946 MKTHNUM - K-th Number
# include <bits/stdc++.h>
# define ls ( i<< 1 )
# define rs ( i<< 1 | 1 )
# define mid ( ( l+ r) >> 1 )
using namespace std;
const int SIZE = 100005 ;
struct ArckaAKIOI {
int l, r, v;
ArckaAKIOI ( ) {
l= 0 , r= 0 , v= 0 ;
}
} t[ SIZE<< 5 ] ;
int top;
int root[ SIZE<< 5 ] ;
int a[ SIZE] , b[ SIZE] ;
int n, m;
int newnode ( int i) {
t[ ++ top] = t[ i] ;
return top;
}
int build ( int i, int l, int r) {
i= ( ++ top) ;
if ( l== r) {
t[ i] . v= a[ l] ;
return i;
}
t[ i] . l= build ( t[ i] . l, l, mid) ;
t[ i] . r= build ( t[ i] . r, mid+ 1 , r) ;
return i;
}
int update ( int i, int l, int r, int p, int val) {
i= newnode ( i) ;
t[ i] . v++ ;
if ( l== r) {
return i;
}
if ( p<= mid) {
t[ i] . l= update ( t[ i] . l, l, mid, p, val) ;
}
else {
t[ i] . r= update ( t[ i] . r, mid+ 1 , r, p, val) ;
}
return i;
}
int query ( int i, int l, int r, int ql, int qr) {
if ( l== r) {
return l;
}
int delta = t[ t[ qr] . l] . v- t[ t[ ql] . l] . v;
if ( delta>= i) {
return query ( i, l, mid, t[ ql] . l, t[ qr] . l) ;
}
else {
return query ( i- delta, mid+ 1 , r, t[ ql] . r, t[ qr] . r) ;
}
}
int kkksc03;
void discretization ( ) {
for ( int i= 1 ; i<= n; i++ ) {
b[ i] = a[ i] ;
}
sort ( b+ 1 , b+ 1 + n) ;
kkksc03 = unique ( b+ 1 , b+ n+ 1 ) - ( b+ 1 ) ;
root[ 0 ] = build ( 0 , 1 , kkksc03) ;
for ( int i= 1 ; i<= n; i++ ) {
root[ i] = update ( root[ i- 1 ] , 1 , kkksc03, lower_bound ( b+ 1 , b+ kkksc03+ 1 , a[ i] ) - b, 114514 ) ;
}
}
int main ( ) {
cin>> n>> m;
for ( int i= 1 ; i<= n; i++ ) {
cin>> a[ i] ;
}
discretization ( ) ;
while ( m-- ) {
int l, r, k;
cin>> l>> r>> k;
cout<< b[ query ( k, 1 , kkksc03, root[ l- 1 ] , root[ r] ) ] << '\n' ;
}
return 0 ;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!