模板题 区间更新点查询
#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;
}