bzoj1452

时间:2022-04-19 08:29:57

题解:

二位树状数组

然后我开了300*300*300就T了

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,opt,z,a[N][N],dx,dy,x,y,f[N][N][],q;
int find(int x,int y,int z)
{
int ans=;
for (;x;x-=x&-x)
for (int i=y;i;i-=i&-i)
ans+=f[x][i][z];
return ans;
}
void insert(int x,int y,int z,int s)
{
for (;x<=n;x+=x&-x)
for (int i=y;i<=m;i+=i&-i)
f[x][i][z]+=s;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
scanf("%d",&a[i][j]),insert(i,j,a[i][j],);
scanf("%d",&q);
while (q--)
{
scanf("%d",&opt);
if (opt==)
{
scanf("%d%d%d",&x,&y,&z);
insert(x,y,a[x][y],-);
a[x][y]=z;
insert(x,y,z,);
}
if (opt==)
{
scanf("%d%d%d%d%d",&x,&dx,&y,&dy,&z);
printf("%d\n",find(dx,dy,z)-find(dx,y-,z)-find(x-,dy,z)+find(x-,y-,z));
}
}
}

相关文章