struct Seg {
int val[4*N];
bool rev[4*N];
void init( int id, int l, int r, int *b ) {
rev[id]=0;
if ( l==r ) {
val[id]=b[l];
return;
}
int m=(l+r)/2;
init(id*2,l,m,b);
init(id*2+1,m+1,r,b);
val[id]=val[id*2]+val[id*2+1];
}
int get( int id, int l, int r ) {
if ( !rev[id] ) return val[id];
else return (r-l+1)-val[id];
}
void push( int id, int l, int r ) {
if ( !rev[id] ) return;
rev[id*2]^=1;
rev[id*2+1]^=1;
rev[id]=0;
}
void pull( int id, int l, int r ) {
int m=(l+r)/2;
val[id]=get(id*2,l,m)+get(id*2+1,m+1,r);
}
int get( int id, int l, int r, int ql, int qr ) {
if ( qr<l || ql>r ) return 0;
if ( ql<=l && r<=qr ) return get(id,l,r);
push(id,l,r);
int m=(l+r)/2,ret=0;
ret+=get(id*2,l,m,ql,qr);
ret+=get(id*2+1,m+1,r,ql,qr);
pull(id,l,r);
return ret;
}
void chg( int id, int l, int r, int ql, int qr ) {
if ( qr<l || ql>r ) return;
if ( ql<=l && r<=qr ) {
rev[id]^=1;
return;
}
push(id,l,r);
int m=(l+r)/2;
chg(id*2,l,m,ql,qr);
chg(id*2+1,m+1,r,ql,qr);
pull(id,l,r);
}
} seg[22];
线段树区间翻转模板
最新推荐文章于 2023-03-19 21:20:49 发布