#include <iostream>
#include <fstream>
#include <math.h>
#define MAX 15001
using namespace std;
int A[MAX];
long long Tree[30000];
long long createTree(int arr[],long long Tree[],int i,int x,int y);
void updateValue(long long Tree[],int pos, int val,int x, int y,int i);
long long getValue(long long Tree[],int posx,int posy, int x, int y, int i);
int main()
{
ifstream f("datorii.in");
ofstream g("datorii.out");
int N,M,i,x,y;
bool choice;
f>>N>>M;
for(i=0;i<N;++i)
{
f>>A[i];
Tree[i] = 0;
}
createTree(A,Tree,0,0,N-1);
for(i=0;i<M;++i)
{
f>>choice>>x>>y;
--x;
if(!choice)
{
updateValue(Tree,x,y,0,N-1,0);
}
else
{
--y;
g<<getValue(Tree,x,y,0,N-1,0)<<"\n";
}
}
return 0;
}
// [x][y] = [x
long long createTree(int arr[],long long Tree[],int i,int x,int y)
{
if(x == y)
{
Tree[i] = arr[x];
return Tree[i];
}
int mid = (x+y)/2;
Tree[i] = createTree(arr,Tree,2*i+1,x,mid) + createTree(arr,Tree,2*i+2,mid+1,y);
return Tree[i];
}
void updateValue(long long Tree[],int pos, int val,int x, int y,int i)
{
if(pos<x || pos > y) return;
Tree[i]-=val;
int mid = (x+y)/2;
if(x!=y)
{
updateValue(Tree,pos,val,x,mid,2*i+1);
updateValue(Tree,pos,val,mid+1,y,2*i+2);
}
}
long long getValue(long long Tree[],int posx,int posy, int x, int y, int i)
{
if(posx <= x && posy >= y)
{
return Tree[i];
}
if(posx>y || posy < x) return 0;
int mid = (x+y)/2;
return getValue(Tree,posx,posy,x,mid,2*i+1) + getValue(Tree,posx,posy,mid+1,y,2*i+2);
}