#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;
}
|