Mobile phones POJ - 1195

点击打开链接

模板题 区间更新点查询

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int sum[5010][5010];
int n;

void pushupy(int curx,int cury)
{
    sum[curx][cury]=sum[curx][2*cury]+sum[curx][2*cury+1];
    return;
}

void pushupx(int tary,int yl,int yr,int curx,int cury)
{
    int m;
    sum[curx][cury]=sum[2*curx][cury]+sum[2*curx+1][cury];
    if(yl==yr) return;
    m=(yl+yr)/2;
    if(tary<=m) pushupx(tary,yl,m,curx,2*cury);
    else pushupx(tary,m+1,yr,curx,2*cury+1);
    return;
}

void updatey(int tary,int val,int yl,int yr,int curx,int cury)
{
    int m;
    if(yl==yr)
    {
        sum[curx][cury]+=val;
        return;
    }
    m=(yl+yr)/2;
    if(tary<=m) updatey(tary,val,yl,m,curx,2*cury);
    else updatey(tary,val,m+1,yr,curx,2*cury+1);
    pushupy(curx,cury);
    return;
}

void updatex(int tarx,int tary,int val,int xl,int xr,int curx)
{
    int m;
    if(xl==xr)
    {
        updatey(tary,val,0,n,curx,1);
        return;
    }
    m=(xl+xr)/2;
    if(tarx<=m) updatex(tarx,tary,val,xl,m,2*curx);
    else updatex(tarx,tary,val,m+1,xr,2*curx+1);
    pushupx(tary,0,n,curx,1);
    return;
}

int queryy(int pyl,int pyr,int yl,int yr,int curx,int cury)
{
    int m,res;
    if(pyl<=yl&&yr<=pyr)
    {
        return sum[curx][cury];
    }
    m=(yl+yr)/2,res=0;
    if(pyl<=m) res+=queryy(pyl,pyr,yl,m,curx,2*cury);
    if(pyr>=m+1) res+=queryy(pyl,pyr,m+1,yr,curx,2*cury+1);
    return res;
}

int queryx(int pxl,int pxr,int pyl,int pyr,int xl,int xr,int curx)
{
    int m,res;
    if(pxl<=xl&&xr<=pxr)
    {
        return queryy(pyl,pyr,0,n,curx,1);
    }
    m=(xl+xr)/2,res=0;
    if(pxl<=m) res+=queryx(pxl,pxr,pyl,pyr,xl,m,2*curx);
    if(pxr>=m+1) res+=queryx(pxl,pxr,pyl,pyr,m+1,xr,2*curx+1);
    return res;
}

int main()
{
    int op,x1,x2,y1,y2,val;
    scanf("%d%d",&op,&n);
    while(1)
    {
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d%d%d",&x1,&y1,&val);
            updatex(x1,y1,val,0,n,1);
        }
        else if(op==2)
        {
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            printf("%d\n",queryx(x1,x2,y1,y2,0,n,1));
        }
        else break;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/80600496
今日推荐