#include <cstdio>
#include <iostream>
using namespace std;
inline void in(int &x) {
x=0;
int f=1;
char ch=getchar();
while (ch<'0'||ch>'9') {
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
x*=f;
}
inline void out(int x) {
if (x<0) putchar('-'),x=-x;
if (x>9) out(x/10);
putchar(x%10+'0');
}
const int N=1e5+5;
struct Tree {
int x,la;
}a[N<<2];
int n,l,m;
int ls(int u) {return u<<1;}
int rs(int u) {return u<<1|1;}
void Pushup(int u) {a[u].x=a[ls(u)].x|a[rs(u)].x;}
void Build(int u,int l,int r) {
a[u].x=1,a[u].la=0;
if (l>=r) return;
int mid=l+r>>1;
Build(ls(u),l,mid);
Build(rs(u),mid+1,r);
}
void Pushdown(int u) {
if (!a[u].la) return;
a[ls(u)].la=a[u].la;
a[rs(u)].la=a[u].la;
a[ls(u)].x=(1<<a[u].la);
a[rs(u)].x=(1<<a[u].la);
a[u].la=0;
}
void Updata(int u,int l,int r,int L,int R,int x) {
if (L<=l&&r<=R) {
a[u].x=(1<<x);
a[u].la=x;
return;
}
Pushdown(u);
int mid=l+r>>1;
if (mid>=L) Updata(ls(u),l,mid,L,R,x);
if (mid<R) Updata(rs(u),mid+1,r,L,R,x);
Pushup(u);
}
int cal(int t) {
int s=0;
while (t) {
s+=(t&1);
t>>=1;
}
return s;
}
int Query(int u,int l,int r,int L,int R) {
if (L<=l&&r<=R) return a[u].x;
Pushdown(u);
int mid=l+r>>1,ans=0;
if (mid>=L) ans|=Query(ls(u),l,mid,L,R);
if (mid<R) ans|=Query(rs(u),mid+1,r,L,R);
return ans;
}
int main() {
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
in(n),in(l),in(m);
Build(1,1,n);
while (m--) {
char op=getchar();
int x,y;
while (op<'A'||op>'Z') op=getchar();
in(x),in(y);
if (x>y) swap(x,y);
if (op=='P') out(cal(Query(1,1,n,x,y))),putchar('\n');
if (op=='C') {
int z;
in(z);
Updata(1,1,n,x,y,z);
}
}
return 0;
}
全 WA 求助