c<=100.。。。。。。。
直接 个权值建一个二维树状数组。
然后维护就好了。。。。。。。
不知道C改大一点会变成什么毒瘤题,反正我是不会做的。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int d[305][305][105],mat[305][305],n,m; inline int lowbit(int x){return x&-x;} void add(int r,int c,int k,int v){ for(int x=r;x<=n;x+=lowbit(x)) for(int y=c;y<=m;y+=lowbit(y)) d[x][y][k]+=v; } int sum(int r,int c,int k){ int ret=0; for(int x=r;x>0;x-=lowbit(x)) for(int y=c;y>0;y-=lowbit(y)) ret+=d[x][y][k]; return ret; } int calc(int x1,int x2,int y1,int y2,int c){ return sum(x2,y2,c)-sum(x1-1,y2,c)-sum(x2,y1-1,c)+sum(x1-1,y1-1,c); } int main(){ int opt,x1,y1,x2,y2,c,q; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ scanf("%d",&mat[i][j]); add(i,j,mat[i][j],1); } scanf("%d",&q); while(q--){ scanf("%d",&opt); if(opt==1){ scanf("%d%d%d",&x1,&y1,&c); add(x1,y1,mat[x1][y1],-1); add(x1,y1,c,1);mat[x1][y1]=c; }else{ scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c); printf("%d\n",calc(x1,x2,y1,y2,c)); } } return 0; }