这个树状数组还是挺好的一道提。我都不知道可以这样写。、
参看http://blog.csdn.net/stiyet/article/details/51942701
//2017年08月10日14:47:24 15min
int n,m; int vis[mxn]; int a[mxn];
struct Node{
int x,y,l,r,d,p,flag,ans;
}node[mxn];
int c[15][mxn];
int sum(int x,int num){
int ans=0;
while(x){
ans+=c[num][x];
x-=(x&(-x));
}
return ans;
}
void update(int num,int x,int val){
while(x<=n){
c[num][x]+=val;
x+=(x&(-x));
}
}
int main(){
int T;sf("%d",&T);
while(T--){
sf("%d%d",&n,&m);
rep(i,1,n)sf("%d",&a[i]);
rep(i,1,m){
char op[3];sf("%s",op);
if(op[0]=='Q'){
node[i].flag=1;
sf("%d%d%d%d",&node[i].l,&node[i].r,&node[i].d,&node[i].p);
}
else{
node[i].flag=0;
sf("%d%d",&node[i].x,&node[i].y);
}
}
int base=1;
for(int i=1;i<=10;++i){
mem(c,0);
for(int j=1;j<=n;++j){
update(a[j]/base%10,j,1);
vis[j]=a[j]/base%10;
}
for(int j=1;j<=m;++j){
if(node[j].flag){
if(node[j].d==i)
node[j].ans=sum(node[j].r,node[j].p)-sum(node[j].l-1,node[j].p);
}
else{
update(vis[node[j].x],node[j].x,-1);
update(node[j].y/base%10,node[j].x,1);
vis[node[j].x]=node[j].y/base%10;
}
}
base*=10;
}
rep(i,1,m){
if(node[i].flag){
pf("%d\n",node[i].ans);
}
}
}
}