这题坑就坑在区间上
从A到B更新询问可能出现A>B..FUCK!
以后要注意这些细节!
#include <stdio.h>
#include <string.h>
#define REP(i,n) for(int i=0;i<n;i++)
#define gl l,(l+r)>>1,num<<1
#define gr ((l+r)>>1)+1,r,num<<1|1
#define lson num<<1
#define rson num<<1|1
#include <algorithm>
using namespace std;
const int MAXN = 100005;
bool tag[40];
short st[MAXN<<4];
void color(int a,int b,int v,int l,int r,int num)
{
if(a<=l&&r<=b)
{
st[num]=v;
return;
}
if(a>r||b<l)
return;
if(st[num]>0)
{
st[lson]=st[num];
st[rson]=st[num];
st[num]=-1;
}
color(a,b,v,gl);
color(a,b,v,gr);
if(st[lson]==st[rson]&&st[num]==-1)
st[num]=st[lson];
}
int ans;
void calc(int a,int b,int l,int r,int num)
{
if(a<=l&&r<=b)
if(st[num]>0)
{
if(!tag[st[num]])
{
tag[st[num]]=true;
ans++;
}
return;
}
if(st[num]>0)
{
st[lson]=st[num];
st[rson]=st[num];
st[num]=-1;
}
if(a>r||b<l)
return;
calc(a,b,gl);
calc(a,b,gr);
if(st[lson]==st[rson]&&st[num]==-1)
st[num]=st[lson];
}
int main()
{
int l,t,o;
while(scanf("%d%d%d",&l,&t,&o)==3)
{
memset(st,0,sizeof(st));
st[1] = 1;
char cmd;
int a,b,v;
while(o--)
{
memset(tag,0,sizeof(tag));
getchar();
scanf("%c%d%d",&cmd,&a,&b);
if(a>b) swap(a,b);
if(cmd=='P')
{
ans=0;
calc(a,b,1,l,1);
printf("%d\n",ans);
}
else
{
scanf("%d",&v);
color(a,b,v,1,l,1);
}
}
}
return 0;
}