区间修改,绝对标记col,询问区间不同颜色数。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int const N=100010;
int n,m,t,ans;
bool f[31];
struct node{
int l,r,col;
}tree[4*N];
void buildtree(int p,int l,int r){
tree[p].l=l;tree[p].r=r;
tree[p].col=1;
if(l==r) return;
int mid=(l+r)>>1;
buildtree(p<<1,l,mid);
buildtree(p<<1|1,mid+1,r);
}
inline void pushdown(int p){
if(tree[p].col==0) return;
tree[p<<1].col=tree[p].col;
tree[p<<1|1].col=tree[p].col;
tree[p].col=0;
}
inline void insert(int p,int x,int y,int k){
int l=tree[p].l,r=tree[p].r;
if(tree[p].col==k) return;
if(l==x&r==y){
tree[p].col=k;return;
}
pushdown(p);
int mid=(l+r)>>1;
if(y<=mid) insert(p<<1,x,y,k);
else if(x>mid) insert(p<<1|1,x,y,k);
else insert(p<<1,x,mid,k),insert(p<<1|1,mid+1,y,k);
}
inline void query(int p,int x,int y){
int col=tree[p].col;
if(col!=0){
if(!f[col]) ans++,f[col]=true;
return;
}
int mid=(tree[p].l+tree[p].r)>>1;
if(y<=mid) query(p<<1,x,y);
else if(x>mid) query(p<<1|1,x,y);
else query(p<<1,x,mid),query(p<<1|1,mid+1,y);
}
int main(){
//freopen("a.in","r",stdin);
scanf("%d%d%d",&n,&t,&m);
buildtree(1,1,n);
while(m--){
char op[1];
int xx,yy;
scanf("%s%d%d",op,&xx,&yy);
int x,y;
x=min(xx,yy);
y=max(xx,yy);
if(op[0]=='C'){
int k;
scanf("%d",&k);
insert(1,x,y,k);
}
if(op[0]=='P'){
memset(f,false,sizeof(f));
ans=0;
query(1,x,y);
printf("%d\n",ans);
}
}
return 0;
}