原题
题目难度并不大,但是太久没有写二维生疏了,就是个模板题,当然,这里如果使用树状数组的话会更加简便,但是毕竟线段树的功能较为强大,为了防止以后遇见了什么骚操作的二维线段树。
#include<bits/stdc++.h>
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
using namespace std;
const int MX=1e3+9;
int n,m,t[MX<<2][MX<<2];
void pushup(int k,int l,int r,int num){
// if( l==r ){ // pushup这个会超时,下面那个不会,这个要极为注意
// t[num][k]=t[num<<1][k]+t[num<<1|1][k];
// return ;
// }
// int mid=(l+r)>>1;
// pushup(lson,num);
// pushup(rson,num);
// t[num][k]=t[num][k<<1]+t[num][k<<1|1];
t[num][k]=t[num<<1][k]+t[num<<1|1][k];
if( l==r )
return ;
int mid=(l+r)>>1;
pushup(lson,num);
pushup(rson,num);
}
void buildy(int k,int l,int r,int x,int num){
if( l==r ){
scanf("%d",&t[num][k]);
return ;
}
int mid=(l+r)>>1;
buildy(lson,x,num);
buildy(rson,x,num);
t[num][k]=t[num][k<<1]+t[num][k<<1|1];
}
void buildx(int k,int l,int r){
if( l==r ){
buildy(1,1,n,l,k);
return ;
}
int mid=(l+r)>>1;
buildx(lson);
buildx(rson);
pushup(1,1,n,k);
}
void updatey(int k,int l,int r,int y,int num){
if( l==r ){
t[num][k]=t[num][k]==1?0:1;
return ;
}
int mid=(l+r)>>1;
if( y<=mid )
updatey(lson,y,num);
else
updatey(rson,y,num);
t[num][k]=t[num][k<<1]+t[num][k<<1|1];
}
void updatex(int k,int l,int r,int x,int y){
if( l==r ){
updatey(1,1,n,y,k);
return ;
}
int mid=(l+r)>>1;
if( x<=mid )
updatex(lson,x,y);
else
updatex(rson,x,y);
pushup(1,1,n,k);
}
int quey(int k,int l,int r,int y1,int y2,int num){
if( y1<=l && r<=y2 )
return t[num][k];
int mid=(l+r)>>1,ans=0;
if( y1<=mid )
ans+=quey(lson,y1,y2,num);
if( mid<y2 )
ans+=quey(rson,y1,y2,num);
return ans;
}
int quex(int k,int l,int r,int x1,int x2,int y1,int y2){
if( x1<=l && r<=x2 )
return quey(1,1,n,y1,y2,k);
int mid=(l+r)>>1,ans=0;
if( x1<=mid )
ans+=quex(lson,x1,x2,y1,y2);
if( mid<x2 )
ans+=quex(rson,x1,x2,y1,y2);
return ans;
}
int main()
{
freopen("input.txt","r",stdin);
while( ~scanf("%d %d",&n,&m) ){
buildx(1,1,n);
while( m-- ){
int order;
scanf("%d",&order);
if( order==1 ){
int x,y;
scanf("%d %d",&x,&y);
updatex(1,1,n,x,y);
}
else{
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
printf("%d\n",quex(1,1,n,x1,x2,y1,y2));
}
}
}
return 0;
}