#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;
int valori[15010];
int arb_int[60040];
void buildtree(int node, int left, int right)
{
if (left == right)
arb_int[node] = valori[left];
else
{
int middle = (left + right) / 2;
buildtree(node * 2, left, middle);
buildtree(node * 2 + 1, middle + 1, right);
arb_int[node] = arb_int[node * 2] + arb_int[node * 2 + 1];
}
}
int getsum(int node, int tree_left, int tree_right, int interval_left, int interval_right)
{
if (tree_left > tree_right)
return 0;
if (tree_left > interval_right || tree_right < interval_left)
return 0;
if (tree_left >= interval_left && tree_right <= interval_right)
return arb_int[node];
int middle = (tree_left + tree_right) / 2;
return getsum(node * 2, tree_left, middle, interval_left, interval_right) + getsum(node * 2 + 1, middle + 1, tree_right, interval_left, interval_right);
}
void update(int node, int position, int value, int tree_left, int tree_right)
{
arb_int[node] -= value;
if (tree_left == tree_right)
return;
int middle = (tree_left + tree_right) / 2;
if (position <= middle)
update(node * 2, position, value, tree_left, middle);
else
update(node * 2 + 1, position, value, middle + 1, tree_right);
}
int main()
{
ifstream f("datorii.in");
ofstream g("datorii.out");
int nr_elemente, nr_operatii, tip_operatie;
f >> nr_elemente >> nr_operatii;
for (int i = 1; i <= nr_elemente; i++)
f >> valori[i];
buildtree(1, 1, nr_elemente);
int interval_left, interval_right, poz, val;
for (int i = 0; i < nr_operatii; i++)
{
f >> tip_operatie;
if (tip_operatie == 1)
{
f >> interval_left >> interval_right;
g << getsum(1, 1, nr_elemente, interval_left, interval_right) << "\n";
}
else
{
f >> poz >> val;
update(1, poz, val, 1, nr_elemente);
}
}
}