http://www.lydsy.com/JudgeOnline/problem.php?id=1452
典型的二维树状数组
不过要把所有的状态维护一下
也就是还要在套上一个数组
应该说是模板题吧
没有什么难度
附上二维树状数组的代码:
const int N=;
int c[N+2][N+2];
int lowbit(int i){
return i&(-i);
}
void add(int x,int y,int value){
while(x<=N){
int i=y;
while(i<=N){
c[x][i]+=value;
i+=lowbit(i);
}
x+=lowbit(x);
}
}
int sum(int x,int y){
int sum=0;
while(x>0){
int i=y;
while(i>0){
sum+=c[x][i];
i-=lowbit(i);
}
x-=lowbit(x);
}
return sum;
}
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=310;
inline void read(int &x){char ch;bool ok;
for(ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if(ch=='-') ok=1;
for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok) x=-x;}
int C[110][N][N],B[N][N];
int lowbit(int i){
return i&(-i);
}
void add(int p,int x,int y,int value){
while(x<=N){
int i=y;
while(i<=N){
C[p][x][i]+=value;
i+=lowbit(i);
}
x+=lowbit(x);
}
}
int sum(int p,int x,int y){
int sum=0;
while(x>0){
int i=y;
while(i>0){
sum+=C[p][x][i];
i-=lowbit(i);
}
x-=lowbit(x);
}
return sum;
}
int main(){
int n,m,x,a,b,c,d,e;
read(n);read(m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
read(B[i][j]);
add(B[i][j],i,j,1);
}
}
int Q;
read(Q);
while(Q--){
read(x);
if(x==1){
read(a),read(b),read(c);
add(B[a][b],a,b,-1);
B[a][b]=c;
add(c,a,b,1);
}
else{
read(a),read(b),read(c),read(d),read(e);
printf("%d\n",sum(e,b,d)-sum(e,b,c-1)-sum(e,a-1,d)+sum(e,a-1,c-1));
}
}
}