【二维树状数组】bzoj1452 [JSOI2009]Count

权值的种类只有100种,对每种开个二维BIT,然后是经典操作。

 1 #include<cstdio>
 2 using namespace std;
 3 int n,m,q,x1,y1,x2,y2,val,op,a[301][301];
 4 struct BIT_2D
 5 {
 6     int d[301][301];
 7     void update(int x,const int &y,const int &V)
 8       {
 9         for(;x<=n;x+=(x&(-x)))
10           for(int j=y;j<=n;j+=(j&(-j)))
11             d[x][j]+=V;
12       }
13     int getsum(int x,const int &y)
14       {
15         int res=0;
16         for(;x;x-=(x&(-x)))
17           for(int j=y;j;j-=(j&(-j)))
18             res+=d[x][j];
19         return res;
20       }
21 }T[101];
22 int main()
23 {
24     scanf("%d%d",&n,&m);
25     for(int i=1;i<=n;++i)
26       for(int j=1;j<=m;++j)
27         {
28           scanf("%d",&a[i][j]);
29           T[a[i][j]].update(i,j,1);
30         } scanf("%d",&q);
31     for(;q>0;--q)
32       {
33           scanf("%d",&op);
34           if(op==1)
35             {
36                 scanf("%d%d%d",&x1,&y1,&val);
37                 T[a[x1][y1]].update(x1,y1,-1);
38                 T[a[x1][y1]=val].update(x1,y1,1);
39             }
40           else
41             {
42                 scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&val);
43                 int t1=T[val].getsum(x2,y2);
44                 int t2=T[val].getsum(x1-1,y2);
45                 int t3=T[val].getsum(x2,y1-1);
46                 int t4=T[val].getsum(x1-1,y1-1);
47                 printf("%d\n",t1-t2-t3+t4);
48             }
49       }
50     return 0;
51 }
posted @ 2014-11-25 16:58  AutSky_JadeK  阅读(176)  评论(0编辑  收藏  举报
TVアニメ「Charlotte(シャーロット)」公式サイト TVアニメ「Charlotte(シャーロット)」公式サイト