Long knowledge. Two-dimensional bit.
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespacestd;intn,m,q,t[ the][305][305],map[305][305];inta,b,c,d,e,f;intLowbit (intx) { returnx& (-x);}voidUpdateintXintYintCintval) { for(inti=x;i<=n;i+=lowbit (i)) for(intj=y;j<=m;j+=Lowbit (j)) T[c][i][j]+=Val;}intAskintXintYintc) { inttmp=0; for(inti=x;i>=1; i-=lowbit (i)) for(intj=y;j>=1; j-=Lowbit (j)) TMP+=T[c][i][j]; returntmp;}intMain () {scanf ("%d%d",&n,&m); for(intI=1; i<=n;i++) for(intj=1; j<=m;j++) {scanf ("%d",&Map[i][j]); Update (I,j,map[i][j],1); } scanf ("%d",&q); for(intI=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); intq1=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, d1, F); printf ("%d\n", q1-q2-q3+Q4); } } return 0;}
Bzoj 1452 Count