1452: [JSOI2009]Count
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 2084 Solved: 1229
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
1
2
HINT
【分析】
虐树状数组的感觉好棒…
开一百个二维树状数组,直接模拟就ok
【代码】
//bzoj 1452 [JSOI2009]Count
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=1e6;
int n,m,Q;
int a[305][305],c[105][305][305];
inline int lowbit(int x) {return x&(-x);}
inline void add(int x,int y,int v,int s)
{
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=m;j+=lowbit(j))
c[v][i][j]+=s;
}
inline int get(int x,int y,int v)
{
int sum=0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
sum+=c[v][i][j];
return sum;
}
int main()
{
int i,j,t,x,y,d,x1,x2,y1,y2;
scanf("%d%d",&n,&m);
fo(i,1,n)
fo(j,1,m)
{
scanf("%d",&a[i][j]);
add(i,j,a[i][j],1);
}
scanf("%d",&Q);
while(Q--)
{
scanf("%d",&t);
if(t==1)
{
scanf("%d%d%d",&x,&y,&d);
add(x,y,a[x][y],-1);
add(x,y,d,1);
a[x][y]=d;
}
else
{
scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&d);
printf("%d\n",get(x2,y2,d)-get(x1-1,y2,d)-get(x2,y1-1,d)+get(x1-1,y1-1,d));
}
}
return 0;
}