/*
_____ _____ _______
/\ \ /\ \ /::\ \
/::\____\ /::\ \ /::::\ \
/:::/ / /::::\ \ /::::::\ \
/:::/ / /::::::\ \ /::::::::\ \
/:::/ / /:::/\:::\ \ /:::/~~\:::\ \
/:::/ / /:::/__\:::\ \ /:::/ \:::\ \
/:::/ / /::::\ \:::\ \ /:::/ / \:::\ \
/:::/ / _____ /::::::\ \:::\ \ /:::/____/ \:::\____\
/:::/____/ /\ \ /:::/\:::\ \:::\ \ ::: | |:::| |
|:::| / /::\____\ /:::/ \:::\ \:::\____\ |:::|____| |:::| |
|:::|____\ /:::/ / \::/ \:::\ /:::/ / \:::\ \ /:::/ /
\:::\ \ /:::/ / \/____/ \:::\/:::/ / \:::\ \ /:::/ /
\:::\ \ /:::/ / \::::::/ / \:::\ /:::/ /
\:::\ /:::/ / \::::/ / \:::\__/:::/ /
\:::\__/:::/ / /:::/ / \::::::::/ /
\::::::::/ / /:::/ / \::::::/ /
\::::::/ / /:::/ / \::::/ /
\::::/ / /:::/ / \::/____/
\::/____/ \::/ / ~~
~~ \/____/
{1}
*/
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ins(x) insert(x)
#define mp(x,y) make_pair(x,y)
#define pb(x) push_back(x)
#define fast_ios ios_base::sync_with_stdio(0),fin.tie(nullptr),fout.tie(nullptr);
#define all(v) (v).begin() , (v).end()
using namespace std;
ifstream fin ( "datorii.in" ) ;
ofstream fout ( "datorii.out" ) ;
int nxt()
{
int x;
fin >> x ;
return x;
}
void close_files()
{
fin.close();
fout.close();
}
class Arbori_de_intervale
{
private:
vector<int>aint;
vector<int>v;
int n;
void build(int left , int right , int nod )
{
if ( left > right )
return ;
if ( left == right ){
aint[nod]=v[left];
return;
}
int mij = ( left + right ) / 2 ;
build(left,mij,nod*2);
build(mij+1,right,nod*2+1);
aint[nod] = aint[nod*2]+aint[nod*2+1];
}
public:
Arbori_de_intervale(int x,vector<int>a)
{
aint.resize(4*x);
v=a;
n = x;
build(1,n,1);
}
void update(int left , int right , int nod , int poz , int val )
{
if ( left > right )
return ;
if ( left == right )
{
if ( left == poz )
v[left]=val,aint[nod]=val;
return;
}
int mij = ( left + right ) / 2;
update(left,mij,nod*2,poz,val);
update(mij+1,right,nod*2+1,poz,val);
aint[nod]=aint[nod*2]+aint[nod*2+1];
}
int query(int left , int right , int nod , int left1 , int right1 )
{
if ( left1 <= left && right <= right1 )
return aint[nod];
if ( left >= right )
return 0;
int mij = ( left + right ) / 2 ;
return query(left,mij,nod*2,left1,right1) + query(mij+1,right,nod*2+1,left1,right1);
}
};
signed main()
{
int n , q;
fin >> n >> q;
vector<int>v(n+1);
for ( int i = 1 ; i <= n; ++ i )
fin >> v[i] ;
Arbori_de_intervale aint(n,v);
while ( q-- )
{
int c;
fin >> c;
if ( c == 1 )
{
int left , right ;
fin >> left >> right ;
fout << aint.query(1,n,1,left,right) << '\n';
}
else{
int val , poz ;
fin >> poz >> val ;
if ( v[poz] < val )
aint.update(1,n,1,poz,0);
else
aint.update(1,n,1,poz,v[poz]-val);
}
}
close_files();
return 0;
}