长知识啦。。二维BIT。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,q,t[105][305][305],map[305][305]; int a,b,c,d,e,f; int lowbit(int x) { return x&(-x); } void update(int x,int y,int c,int val) { for (int i=x;i<=n;i+=lowbit(i)) for (int j=y;j<=m;j+=lowbit(j)) t[c][i][j]+=val; } int ask(int x,int y,int c) { int tmp=0; for (int i=x;i>=1;i-=lowbit(i)) for (int j=y;j>=1;j-=lowbit(j)) tmp+=t[c][i][j]; return tmp; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) { scanf("%d",&map[i][j]); update(i,j,map[i][j],1); } scanf("%d",&q); for (int i=1;i<=q;i++) { scanf("%d",&a); if (a==1) { scanf("%d%d%d",&b,&c,&d); update(b,c,map[b][c],-1); update(b,c,d,1); map[b][c]=d; } else { scanf("%d%d%d%d%d",&b,&c,&d,&e,&f); int q1=0,q2=0,q3=0,q4=0; q1=ask(c,e,f); if (b>=2) q2=ask(b-1,e,f); if (d>=2) q3=ask(c,d-1,f); if ((b>=2) && (d>=2)) q4=ask(b-1,d-1,f); printf("%d\n",q1-q2-q3+q4); } } return 0; }