rt。
算了一下空间也没有MLE的道理,想着需不需要动态开点?
#include <bits/stdc++.h>
using namespace std;
struct sgt{
int l,r;
bool hv,lzhv;
}t[32][4*100000+2];
int n,m,q,l,r,x,ans;
char ch;
void build(int p,int l,int r){
int ls,rs,mid;
ls=p<<1,rs=p<<1|1,mid=0;
for(int i=1;i<=m;i++) t[i][p].l=l,t[i][p].r=r;
if(l==r){
t[1][p].hv=1;
return ;
}
mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
t[1][p].hv=t[1][ls].hv||t[1][rs].hv;
}
void pushdown(int k,int p){
int ls,rs;
ls=p<<1,rs=p<<1|1;
if(t[k][p].lzhv){
t[k][ls].lzhv=1;
t[k][ls].hv=t[k][p].hv;
t[k][rs].lzhv=1;
t[k][rs].hv=t[k][p].hv;
t[k][p].lzhv=0;
}
}
void paint(int k,int p,int fl,int fr,bool cs){
int ls,rs,mid;
ls=p<<1,rs=p<<1|1,mid=0;
if(t[k][p].l>=fl&&t[k][p].r<=fr){
t[k][p].hv=cs;
t[k][p].lzhv=1;
return ;
}
pushdown(k,p);
mid=(t[k][p].l+t[k][p].r)>>1;
if(fl<=mid) paint(k,ls,fl,fr,cs);
if(fr>mid) paint(k,rs,fl,fr,cs);
t[k][p].hv=t[k][ls].hv||t[k][rs].hv;
}
bool query(int k,int p,int fl,int fr){
int ls,rs,mid;
bool sum;
ls=p<<1,rs=p<<1|1,mid=0;sum=0;
if(t[k][p].l>=fl&&t[k][p].r<=fr) return t[k][p].hv;
pushdown(k,p);
mid=(t[k][p].l+t[k][p].r)>>1;
if(fl<=mid) sum|=query(k,ls,fl,fr);
if(fr>mid) sum|=query(k,rs,fl,fr);
t[k][p].hv=t[k][ls].hv||t[k][rs].hv;
return sum;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
//LL!
cin>>n>>m>>q;
build(1,1,n);
/* for(int i=1;i<=m;i++){
cout<<i<<":\n";
for(int j=1;j<=n;j++)
cout<<query(i,1,j,j)<<"\n";
}
cout<<"\n\n";*/
while(q--){
cin>>ch;
if(ch=='C'){
cin>>l>>r>>x;
if(l>r) swap(l,r);
for(int i=1;i<=m;i++) paint(i,1,l,r,0);
paint(x,1,l,r,1);
}
if(ch=='P'){
cin>>l>>r;
if(l>r) swap(l,r);
ans=0;
for(int i=1;i<=m;i++)
ans+=query(i,1,l,r);
cout<<ans<<"\n";
}
/* for(int i=1;i<=m;i++){
cout<<i<<":\n";
for(int j=1;j<=n;j++)
cout<<query(i,1,j,j)<<"\n";
}
cout<<"\n\n";*/
}
return 0;
}