区间查询+单点修改
#include<cstdio>
#include<cstring>
const int N=1e5;
inline int read()
{
int ans=0;char t=getchar();int f=1;
while(t<'0'||t>'9') f=(t=='-'?-1:1),t=getchar();
while(t>='0'&&t<='9') ans=ans*10+t-'0',t=getchar();
return ans*f;
}
int tr[4*N];
int n;
int M;
inline void build()
{
for(M=1;M<n;M<<=1);//叶子个数
for(int i=M;i<n+M;i++) tr[i]=read();//每个叶子
for(int i=M-1;i;i--) tr[i]=tr[i<<1]+tr[i<<1|1];
}
inline void add(int u,int v)
{
for(tr[u+=M-1]+=v,u>>=1;u;u>>=1)
tr[u]=tr[u<<1]+tr[u<<1|1];
}
inline int query(int u,int v)
{
u+=M-1,v+=M-1;
if(u==v) return tr[u];
int ans=tr[u]+tr[v];
for( ;u^v^1;u>>=1,v>>=1)
{
if(~u&1) ans+=tr[u^1];
if(v&1) ans+=tr[v^1];
}
return ans;
}
int main()
{
n=read();
build();
int m=read(),opt;int u,v;
for(int i=1;i<=m;i++)
{
opt=read();
if(opt==1) u=read(),v=read(),add(u,v);
else u=read(),v=read(),printf("%d\n",query(u,v));
}
return 0;
}