#include <stdio.h>
#define Nmax 15001
using namespace std;
int N,M,vec[Nmax],rad,part[Nmax];
FILE*f = fopen("datorii.in","r");
FILE*g = fopen("datorii.out","w");
void read_data()
{
fscanf(f,"%d%d",&N,&M);
int i;
for(i=1;i<=N;++i)
fscanf(f,"%d",&vec[i]);
}
int minim(int a,int b)
{
if(a<=b)
return a;
return b;
}
int maxim(int a,int b)
{
if(a>=b)
return a;
return b;
}
int query(int x,int y)
{
int sum,left,right,st,dr,cnt,j;
for(left=1, right = left+rad-1,cnt=1,sum=0;left <= N;left=right+1,right += rad,++cnt)
{
st = maxim(left, x);
dr = minim(right, y);
dr = minim(dr, N);
if(st == left && dr == right)//..X...left...right...Y....
sum += part[cnt];
else
{
for(j=st;j<=dr;++j)
sum += vec[j];
}
}
return sum;
}
void update(int poz,int val)
{
vec[poz] -= val;
int left,right,ok=0,cnt;
for(left=1, right = left+rad-1, cnt=1;left<=N && !ok;left=right+1,right+=rad, ++cnt)
if(left<=poz && poz<=right)
{
part[cnt] -= val;
ok = 1;
}
return;
}
void get_it()
{
for(rad=1;rad*rad<=N;++rad);
--rad;
int i,j;
for(i=1,j=1;i<=N;++i)//pun sumele pe bucati(prima bucata a doua etc);
{
part[j] += vec[i];
if(j*rad == i)
++j;
}
}
int main()
{
read_data();
get_it();
int op,x,y;
while(M--)
{
fscanf(f,"%d%d%d",&op,&x,&y);
if(op)
fprintf(g,"%d\n", query(x,y));
else
update(x,y);
}
fclose(f);
fclose(g);
return 0;
}