poj2155树状数组 区间更新 单点查询

树状数组常规写法:

1.单点更新(递增) 区间查询(递减)

2.区间更新(递减)单点查询(递增)

#include<iostream>
#include<vector>
#include<queue>
#include<map>
#include<cstdio>
#include<cstring>
#define maxn 1005
#define INF 0xfffffff
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b
int n,t;
char s[10];
int c[maxn][maxn];
using namespace std;
int lowbit(int x)
{
    return x&(-x);
}
void updata(int x1,int y1)//区间更新,逆序
{
    for(int i=x1;i>0;i-=lowbit(i))
    {
        for(int j=y1;j>0;j-=lowbit(j))
        {
            c[i][j]^=1;
        }
    }
}
int sum(int x,int y)//单点查询,逆序
{
    int ret=0;
    for(int i=x;i<=n;i+=lowbit(i))
    {
        for(int j=y;j<=n;j+=lowbit(j))
        {
            ret^=c[i][j];
        }
    }
    return ret;
}
int main()
{
    int T,x1,x2,y1,y2;
    scanf("%d",&T);
    for(int tt=1;tt<=T;tt++)
    {
        scanf("%d %d",&n,&t);
        memset(c,0,sizeof(c));
        while(t--)
        {
            scanf("%s",s);
            if(s[0]=='C')
            {
                scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
                updata(x2,y2);
                updata(x2,y1-1);//区间更新
                updata(x1-1,y2);
                updata(x1-1,y1-1);
            }
            else
            {
                scanf("%d %d",&x1,&y1);
                printf("%d\n",sum(x1,y1));//单点查询
            }
        }
        printf("\n");
    }
	return 0;
}


你可能感兴趣的:(poj2155树状数组 区间更新 单点查询)