Pagini recente » Cod sursa (job #1069829) | Cod sursa (job #334253) | Cod sursa (job #1773342) | Cod sursa (job #2114196) | Cod sursa (job #3207225)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
const int N_MAX = 15001, A_MAX = 60004; /// = 4 * N_MAX
int N, M;
int poz, val, start, finish;
int v[N_MAX], a[A_MAX];
void build(int nod, int l, int r){
if(l == r){
a[nod] = v[l];
return;
}
int m = (l + r) / 2;
build(2 * nod, l, m);
build(2 * nod + 1, m + 1, r);
a[nod] = a[2 * nod] + a[2 * nod + 1];
}
void Update(int nod, int l, int r){
a[nod] -= val;
if(l == r){
return;
}
int m = (l + r) / 2;
if(poz <= m)
Update(2 * nod, l, m);
else
Update(2 * nod + 1, m + 1, r);
}
int Query(int nod, int l, int r){
if(start <= l && r <= finish)
return a[nod];
int m = (l + r) / 2, sum = 0;
if(start <= m)
sum += Query(2 * nod, l, m);
if(finish > m)
sum += Query(2 * nod + 1, m + 1, r);
return sum;
}
int main()
{
f >> N >> M;
for(int i = 1; i <= N; ++i)
f >> v[i];
build(1, 1, N);
for(int i = 0, c, x, y; i < M; ++i){
f >> c >> x >> y;
switch(c){
case 0:
poz = x, val = y;
Update(1, 1, N);
break;
case 1:
start = x, finish = y;
g << Query(1, 1, N) << '\n';
break;
}
}
return 0;
}