Pagini recente » Cod sursa (job #2107158) | Cod sursa (job #517045) | Cod sursa (job #2381637) | Cod sursa (job #1362655) | Cod sursa (job #2612312)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct node{
node* st = nullptr;
node* dr = nullptr;
int a, b, val = 0;
};
void constr( node* p, int a, int b) {
if( a < b ){
p->st = new node;
constr( p->st, a, ( a + b ) / 2);
p->dr = new node;
constr ( p->dr, (a+b)/2 + 1, b);
}
p->a = a;
p->b = b;
}
void schimbare_val(node* p, int a, int val){
if( p -> a != p -> b ){
if (a <= ( p -> a + p-> b) / 2)
schimbare_val( p-> st, a, val);
else
schimbare_val(p->dr, a, val);
p-> val = p -> st-> val + p-> dr-> val;
} else{
p-> val += val;
}
}
int interogare( node * p, int a, int b ){
if( p-> a == a && p-> b == b)
return p-> val;
int mij = (p->a + p->b) / 2;
if( mij >= b){
return interogare( p->st, a, b);
}
if( mij < a){
return interogare( p->dr, a, b);
}
int i, j;
i = interogare( p->st, a, mij);
j = interogare( p->dr, mij+1, b);
return i + j;
}
void distrug( node * p){
if( p-> st != nullptr)
distrug( p->st);
if( p-> dr != nullptr)
distrug( p->dr);
delete(p);
}
int main()
{
ifstream in ("datorii.in");
ofstream out ("datorii.out");
int N, M;
in >> N >> M;
node * arb = new node;
constr( arb, 0, N-1);
for( int i = 0; i < N; i++){
int x;
in >> x;
schimbare_val( arb, i, x);
}
while( M != 0){
int q, a, b;
in >> q >> a >> b;
if( q == 0){
schimbare_val ( arb, a-1, -b);
}
else{
out << interogare(arb, a-1, b-1) << "\n";
}
M--;
}
distrug(arb);
return 0;
}