#include <bits/stdc++.h>
using namespace std;
ifstream fin ("datorii.in");
ofstream fout ("datorii.out");
const int dim = 15e3 + 5;
const int dim1 = (1 << 19);
int n , m , v[dim] , seg_tree[dim1];
void build (int node , int left , int right)
{
if(left == right)
seg_tree[node] = v[left];
else
{
int middle = (left + right) / 2;
build(2 * node , left , middle);
build(2 * node + 1 , middle + 1 , right);
seg_tree[node] = seg_tree[2 * node] + seg_tree[2 * node + 1];
}
}
void update (int node , int left , int right , int day , int sum)
{
if(left == right)
seg_tree[node] -= sum;
else
{
int middle = (left + right) / 2;
if(day <= middle)
update(2 * node , left , middle , day , sum);
if(day >= middle + 1)
update(2 * node + 1 , middle + 1 , right , day , sum);
seg_tree[node] = seg_tree[2 * node] + seg_tree[2 * node + 1];
}
}
int query (int node , int left , int right , int queryLeft , int queryRight)
{
if(left >= queryLeft && right <= queryRight)
return seg_tree[node];
else
{
int middle = (left + right) / 2;
if(queryRight <= middle)
return query(2 * node , left , middle , queryLeft , queryRight);
if(queryLeft >= middle + 1)
return query(2 * node + 1 , middle + 1 , right , queryLeft , queryRight);
return query(2 * node , left , middle , queryLeft , queryRight) + query(2 * node + 1 , middle + 1 , right , queryLeft , queryRight);
}
}
int main()
{
fin >> n >> m;
for(int i = 1 ; i <= n ; ++i)
fin >> v[i];
build(1 , 1 , n);
while(m--)
{
bool operation;
int left , right , day , sum;
fin >> operation;
if(operation == 0)
{
fin >> day >> sum;
update(1 , 1 , n , day , sum);
}
else
{
fin >> left >> right;
fout << query(1 , 1 , n , left , right) << '\n';
}
}
}