Description
Input
Output
Sample Input
2 2 4 C 1 1 2 P 1 2 C 2 2 2 P 1 2
Sample Output
2 1
Source
#include<stdio.h>
#include<string.h>
#define maxn 100000
struct node
{
int l,r;
int color;
int add;
}tree[3*maxn];
void pushdown(int p)
{
if(tree[p].add)
{
tree[p<<1].add=tree[p].add;
tree[p<<1|1].add=tree[p].add;
tree[p<<1].color=tree[p].color;
tree[p<<1|1].color=tree[p].color;
tree[p].add=0;
}
}
void build(int p,int l,int r)
{
tree[p].l=l;
tree[p].r=r;
tree[p].color=1;
tree[p].add=1;
if(l==r)
return ;
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
}
void update(int p,int l,int r,int val)
{
if(l<=tree[p].l && tree[p].r<=r)
{
tree[p].color=val;
tree[p].add=1;
return ;
}
pushdown(p);
int mid=(tree[p].l+tree[p].r)>>1;
if(r<=mid)
update(p<<1,l,r,val);
else if(l>mid)
update(p<<1|1,l,r,val);
else
{
update(p<<1,l,mid,val);
update(p<<1|1,mid+1,r,val);
}
tree[p].color=tree[p<<1].color|tree[p<<1|1].color;
}
int sum=0;
void query(int p,int l,int r)
{
if(l<=tree[p].l && r>=tree[p].r)
{
sum|=tree[p].color;
return ;
}
pushdown(p);
int mid=(tree[p].l + tree[p].r)>>1;
if(r<=mid)
query(p<<1,l,r);
else if(l>mid)
query(p<<1|1,l,r);
else
{
query(p<<1,l,mid);
query(p<<1|1,mid+1,r);
}
}
int answer()
{
int ans=0;
while(sum)
{
if(sum&1)
ans++;
sum>>=1;
}
return ans;
}
int main()
{
int l,t,o;
while(~scanf("%d%d%d",&l,&t,&o))
{
char op;
build(1,1,l);
getchar();
int x,y,z;
for(int i=0;i<o;i++)
{
scanf("%c",&op);
if(op=='C')
{
scanf("%d%d%d",&x,&y,&z);
if(x>y)
{
x=x^y;
y=x^y;
x=x^y;
}
update(1,x,y,1<<(z-1));
}
else
{
scanf("%d%d",&x,&y);
if(x>y)
{
x=x^y;
y=x^y;
x=x^y;
}
sum=0;
query(1,x,y);
printf("%d\n",answer());
}
getchar();
}
}
return 0;
}