萌新刚学线段树,本题样例都没过,请dalao帮看一下,谢谢。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=5e5;
int tree[4*N],a[N];
int n,m;
inline int read()
{
char ch=getchar();
int x=0,f=1;
while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void build(int k,int l,int r)
{
if(l==r) {tree[k]=a[l];return ;}
int mid=(l+r)>>1;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
tree[k]=tree[k*2]+tree[k*2+1];
return ;
}
void change(int k,int l,int r,int x,int v)
{
if(r<x||l>x) return ;
if(l==r&&l==x) {tree[l]+=v;return ;}
int mid=(l+r)>>1;
change(k*2,l,mid,x,v);
change(k*2+1,mid+1,r,x,v);
tree[k]=tree[k*2]+tree[k*2+1];
return;
}
int query(int k,int l,int r,int x,int y)
{
if(r<x||l>y) return 0;
if(x<=l&&y>=r) return tree[k];
int mid=(l+r)>>1;
return query(k*2,l,mid,x,y)+query(k*2+1,mid+1,r,x,y);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,1,n);
for(int i=1;i<=m;i++)
{
int p,x,y;
p=read(),x=read(),y=read();
if(p==1) change(1,1,n,x,y);
else cout<<query(1,1,n,x,y)<<endl;
}
return 0;
}