解题思路
线段树之前打过几道模板题,然后就没用过了,这次又学了一遍,希望之后可以用到。。
这道题是道模板题,直接上线段树的单点修改,区间查询。
代码
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int n,m,k,a,b;
long long sum[400010];
void change(int k,int l,int r,int x,int v){
if(l==r)
{
sum[k]+=v;
return;
}
int mid=(l+r)/2;
if(x<=mid)change(k*2,l,mid,x,v);
else change(k*2+1,mid+1,r,x,v);
sum[k]=sum[k*2]+sum[k*2+1];
}
long long query(int k,int l,int r,int x,int y){
if(l>=x&&r<=y)
return sum[k];
int mid=(l+r)/2;
long long res=0;
if(x<=mid)res+=query(k*2,l,mid,x,y);
if(y>mid)res+=query(k*2+1,mid+1,r,x,y);
return res;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&k,&a,&b);
if(k==0)
change(1,1,n,a,b);
if(k==1)
{
printf("%lld\n",query(1,1,n,a,b));
}
}
}