#include <fstream>
#include <iostream>
#include <vector>
std::ifstream in;
std::ofstream out;
class AINT{
std::vector<int> v;
int sum;
public:
AINT(){
v.resize(400005);
sum = 0;
}
void update(int, int, int, int, int);
void query(int, int, int, int, int);
void pay(int, int, int, int, int);
void resetMax(){
sum = 0;
}
int getMax(){
return sum;
}
};
void AINT::update(int node, int left, int right, int pos, int x) {
if(left == right){
v[node] = x;
return;
}
else{
int mid = (left + right) / 2;
if(pos <= mid){
update(2*node, left, mid, pos, x);
}
else{
update(2*node + 1, mid + 1, right, pos, x);
}
v[node] = v[2*node] + v[2*node+1];
}
}
void AINT::query(int node, int left, int right, int a, int b) {
if(a<=left and right<=b){
sum += v[node];
return;
}
else{
int mid = (left + right) / 2;
if(a <= mid)
query(2*node, left, mid, a, b);
if(b > mid)
query(2*node + 1, mid + 1, right, a, b);
}
}
void AINT::pay(int node, int left, int right, int pos, int x) {
if(left == right){
v[node] -= x;
return;
}
else{
int mid = (left + right) / 2;
if(pos <= mid){
pay(2*node, left, mid, pos, x);
}
else{
pay(2*node + 1, mid + 1, right, pos, x);
}
v[node] = v[2*node] + v[2*node+1];
}
}
int main() {
int n, i , m, op, a, b, x;
in.open("datorii.in");
in>>n>>m;
AINT aint;
for(i=0;i<n;i++){
in>>x;
aint.update(1, 1, n, i + 1 , x);
}
out.open("datorii.out");
for(i = 0; i < m; i++){
in>>op>>a>>b;
if(op == 1){
aint.resetMax();
aint.query(1,1,n,a,b);
out<<aint.getMax() << '\n';
}
else{
aint.pay(1,1,n,a,b);
}
}
in.close();
out.close();
return 0;
}