BZOJ 1452 Count 【模板】二维树状数组

对每种颜色开一个二维树状数组

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=310;
 5 int t[110][maxn][maxn],c[maxn][maxn],Q,n,m,k,x,y,xx,yy,col; 
 6 inline void read(int &k){
 7     k=0; int f=1; char c=getchar();
 8     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
 9     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
10     k*=f;
11 }
12 inline void add(int col,int x,int y,int del){
13     for(int i=y;i<=n;i+=i&-i)
14         for(int j=x;j<=m;j+=j&-j) t[col][i][j]+=del;
15 }
16 inline int query(int col,int x,int y){
17     int ret=0;
18     for(int i=y;i;i-=i&-i)
19         for(int j=x;j;j-=j&-j) ret+=t[col][i][j];
20     return ret;
21 }
22 int main(){
23     read(n); read(m); 
24     for(int i=1;i<=n;i++)
25         for(int j=1;j<=m;j++) read(x),c[i][j]=x,add(x,i,j,1);
26     read(Q);
27     while(Q--){
28         read(k);
29         if(k==1){
30             read(x); read(y); read(col);
31             add(c[x][y],x,y,-1); add(col,x,y,1); c[x][y]=col;
32         }
33         else{
34             read(x); read(xx); read(y); read(yy); read(col);
35             printf("%d\n",query(col,xx,yy)-query(col,x-1,yy)-query(col,xx,y-1)+query(col,x-1,y-1));
36         }
37     }
38     return 0;
39 }
View Code

 

posted @ 2017-12-06 19:40  Driver_Lao  阅读(156)  评论(0编辑  收藏  举报