BZOJ1452 [JSOI2009]Count

时间:2023-03-08 22:18:37
BZOJ1452 [JSOI2009]Count

Description

BZOJ1452 [JSOI2009]Count

Input

BZOJ1452 [JSOI2009]Count

Output

BZOJ1452 [JSOI2009]Count

Sample Input

BZOJ1452 [JSOI2009]Count

Sample Output

1
2

HINT

BZOJ1452 [JSOI2009]Count

正解:二维树状数组

解题报告:

  这是一道送肉题。二维树状数组直接维护每种颜色的出现次数,颜色编号也很小,所以直接开数组存就可以了。

 //It is made by jump~
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#ifdef WIN32
#define OT "%I64d"
#else
#define OT "%lld"
#endif
using namespace std;
typedef long long LL;
const int MAXC = ;
const int MAXN = ;
int n,m,ans;
int shu[MAXC][MAXN][MAXN];
int a[MAXN][MAXN];
int que[][]; inline int getint()
{
int w=,q=;
char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar();
if (c=='-') q=, c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar();
return q ? -w : w;
} inline void add(int x,int y,int val,int hh){
for(int i=x;i<=n;i+=i&(-i))
for(int j=y;j<=m;j+=j&(-j))
shu[val][i][j]+=hh;
} inline int ask(int x,int y,int val){
int tot=;
for(int i=x;i;i-=i&(-i))
for(int j=y;j;j-=j&(-j))
tot+=shu[val][i][j];
return tot;
} inline void query(int val){
ans=ask(que[][],que[][],val)-ask(que[][]-,que[][],val)-ask(que[][],que[][]-,val)+ask(que[][]-,que[][]-,val);
} inline void work(){
n=getint(); m=getint();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
a[i][j]=getint(),add(i,j,a[i][j],);
int q=getint();
int ljh; int x,y,z;
while(q--) {
ljh=getint();
if(ljh==) {
x=getint(); y=getint(); z=getint();
add(x,y,a[x][y],-);
add(x,y,z,); a[x][y]=z;
}
else{
que[][]=getint(); que[][]=getint();
que[][]=getint(); que[][]=getint();
z=getint();
query(z); printf("%d\n",ans);
}
}
} int main()
{
work();
return ;
}