bzoj 1452
裸二维树状数组。
输出的时候要记得容斥。
#include<cstdio> #include<cctype> #include<algorithm> using namespace std; int read(){ char c; while(!isdigit(c=getchar())); int x=c-'0'; while(isdigit(c=getchar())) x=x*10+c-'0'; return x; } int n,m,c[101][301][301],a[301][301]; void add(int x,int i,int q,int v){ for(;i<=n;i+=i&-i) for(int j=q;j<=m;j+=j&-j) c[x][i][j]+=v; } int ask(int i,int q,int v){ int ans=0; for(;i;i-=i&-i) for(int j=q;j;j-=j&-j) ans+=c[v][i][j]; return ans; } int main(){ n=read(),m=read(); for(int i=1;i<=n;i+=1) for(int j=1;j<=m;j+=1) add(a[i][j]=read(),i,j,1); int q=read(); while(q--){ int o=read(); if(o==1){ int x=read(),y=read(),c=read(); add(a[x][y],x,y,-1); add(a[x][y]=c,x,y,1); }else{ int x1=read()-1,x2=read(),y1=read()-1,y2=read(),c=read(); printf("%d\n",ask(x2,y2,c)+ask(x1,y1,c)-ask(x2,y1,c)-ask(x1,y2,c)); } } return 0; }