#include<cstdio>
const int maxn=100001;
int a[maxn],cur=0;
struct treetype
{
int left,right;
int lptr,rptr;
int sum;
}tree[2*maxn];
void buildtree(int ll,int rr)
{
int tot=++cur;
tree[tot].left=ll;
tree[tot].right=rr;
if (ll!=rr-1)
{
tree[tot].lptr=cur+1;//记录左右儿子的编号(位置)
buildtree(ll,(ll+rr)/2);
tree[tot].rptr=cur+1;
buildtree((ll+rr)/2,rr);
tree[tot].sum=tree[tree[tot].lptr].sum+tree[tree[tot].rptr].sum;
}
else tree[tot].sum=a[ll];
}
void change(int k,int c,int delta)
{
if (tree[k].left==tree[k].right-1)
tree[k].sum+=delta;
else
{
if (c<(tree[k].left+tree[k].right)/2)
change(tree[k].lptr,c,delta);
if (c>=(tree[k].left+tree[k].right)/2)
change(tree[k].rptr,c,delta);
tree[k].sum=tree[tree[k].lptr].sum+tree[tree[k].rptr].sum;
}
}
int query(int k,int ll,int rr)
{
if (ll<=tree[k].left&&rr>=tree[k].right) return tree[k].sum;
int ans=0;//在函数内部定义,防止搜索下一层时,丢掉了上一层的值,相当于每一层重新定义一个新变量
if (ll<(tree[k].left+tree[k].right)/2) ans+=query(tree[k].lptr,ll,rr);
if (rr>(tree[k].left+tree[k].right)/2) ans+=query(tree[k].rptr,ll,rr);
return ans;
}
int main()
{
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
buildtree(1,n+1);
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if (x==1) change(1,y,z);
if (x==2) printf("%d\n",query(1,y,z+1));
}
return 0;
}