#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int v[100001], suma[400004];
int create(int nod, int l, int r)
{
if(r==l) //dc suntem in frunza
{
suma[nod] = v[l];
return v[l];
}
//else -> dc suntem in nod interior
int mid = (l+r)/2; //in caz de overflow: l+(r-l)2;
int val1 = create(2*nod, l, mid);
int val2 = create(2*nod+1, mid+1, r);
suma[nod] = val1+val2;
return suma[nod];
}
void update(int nod, int l, int r, int ind, int val)
{
if(r==l)
{
v[l] -= val;
suma[nod] -= val ;
}
else
{
int mid = l+(r-l)/2;
if(ind <= mid)
update(2*nod, l, mid, ind, val);
else
update(2*nod+1, mid+1, r, ind, val);
suma[nod] = suma[2*nod] + suma[2*nod +1];
}
}
int query(int nod, int l, int r, int st, int dr)
//l, r capetele intervalului de care este raspunzator nodul
//st, dr capetele intervalului din cerinta
{
if(l>=st && r<=dr)
return suma[nod];
else
if(r<st || l>dr)
return 0;
//else
int mid = (l+r)/2;
int val1 = query(2*nod, l, mid, st, dr);
int val2 = query(2*nod +1, mid+1, r, st, dr);
return val1+val2;
}
int main()
{
int n, m, cod, p, q, i;
fin>>n>>m;
for(i=1; i<=n; i++)
fin>>v[i];
create(1, 1, n);
for(i=1; i<=m; i++)
{
fin>>cod>>p>>q;
if(cod==1)
fout<<query(1, 1, n, p, q)<<'\n';
else
update(1, 1, n, p, q);
}
}