Pagini recente » Cod sursa (job #2459457) | Cod sursa (job #2464608) | Cod sursa (job #909755) | Cod sursa (job #2909681) | Cod sursa (job #1821659)
#include <cstdio>
using namespace std;
int n, m, type, a, b, ans, v[60000];
int sum (int x, int y)
{
return x + y;
}
void build ()
{
for (int i=n-1; i>0; i--){
v[i] = sum (v[2*i], v[2*i+1]);
}
}
void update (int x, int y)
{
int node = x+n-1;
v[node] -= y;
node /= 2;
while (node>0){
v[node] = sum (v[2*node], v[2*node+1]);
node /= 2;
}
}
void query (int node, int left, int right)
{
int mid = (left + right) /2;
if (a <= left && right <= b){
ans = sum (ans, v[node]);
return ;
}
if (a <= mid){
query (node*2, left, mid);
}
if (b > mid){
query (node*2+1, mid+1, right);
}
}
void show ()
{
for (int i=1; i<=2*n; i++){
printf ("%d ", v[i]);
}
printf("\n");
}
int main ()
{
freopen ("datorii.in", "r", stdin);
freopen ("datorii.out", "w", stdout);
scanf ("%d %d", &n, &m);
type = 1;
while (type<n){
type *= 2;
}
for (int i=type; i<type+n; i++){
scanf ("%d", &v[i]);
}
n = type;
build ();
for (int i=1; i<=m; i++){
scanf ("%d %d %d", &type, &a, &b);
if (type == 0){
update (a, b);
}
else{
ans = 0;
query (1, 1, n);
printf ("%d\n", ans);
}
}
return 0;
}