#include<stdio.h> #include<algorithm> using namespace std;
const int MAX=100000; int L,T,O; int tree[MAX*3]; //每个结点表示其对应区间段的颜色
void update(int node,int l,int r,int lc,int rc,int newValue) { if(l==lc&&r==rc) { tree[node]=newValue; return; }
if(tree[node]>0) //自上向下更新结点
{ tree[node<<1]=tree[(node<<1)+1]=tree[node]; tree[node]=0; } int middle=(l+r)>>1; if(middle<lc) update((node<<1)+1,middle+1,r,lc,rc,newValue); else if(middle>=rc) update(node<<1,l,middle,lc,rc,newValue); else { update(node<<1,l,middle,lc,middle,newValue); update((node<<1)+1,middle+1,r,middle+1,rc,newValue); } }
void inquire(int node,int l,int r,int lc,int rc,int &value) { if(tree[node]&&l==lc&&r==rc) { value|=1<<tree[node]; return ; }
if(tree[node]>0) tree[node<<1]=tree[(node<<1)+1]=tree[node]; //更新深入
int middle=(l+r)>>1; if(middle<lc) inquire((node<<1)+1,middle+1,r,lc,rc,value); else if(middle>=rc) inquire(node<<1,l,middle,lc,rc,value); else { inquire(node<<1,l,middle,lc,middle,value); inquire((node<<1)+1,middle+1,r,middle+1,rc,value); } }
int convertSum(int &value) //提取颜色
{ int sum=0; for(int i=1;i<=30;i++) if(value&(1<<i)) sum++; return sum; }
int main() { scanf("%d%d%d",&L,&T,&O); tree[1]=1;
int a,b,c; char str[2]; for(int i=0;i<O;i++) { scanf("%s",str); if(str[0]=='C') { scanf("%d%d%d",&a,&b,&c); if(a>b) swap(a,b); update(1,1,L,a,b,c); } else { scanf("%d%d",&a,&b); if(a>b) swap(a,b); c=0; inquire(1,1,L,a,b,c); printf("%d\n",convertSum(c)); } } return 0; }
|