Pagini recente » Cod sursa (job #2567326) | Cod sursa (job #1089525) | Cod sursa (job #998174) | Cod sursa (job #136835) | Cod sursa (job #2756264)
/*
Vreau sa am o cutie neagra careia ii dau update-uri si query-uri de genul: care este suma pe un anumit interval
Pt ca e suma, pot sa fac ceva de genul sume partiale, cu AIB-uri
Dar momentan implementez cu arbori de intervale, dupa cu AIB-uri
*/
#include <iostream>
#include <fstream>
#define NMAX 15000
using namespace std;
ifstream fin ("datorii.in");
ofstream fout ("datorii.out");
int tip, a, b;
int tree[4 * NMAX + 1];
int v[NMAX + 1];
void buildArbore(int node, int left, int right){
if(left == right){
tree[node] = v[left];
return;
}
int mid = left + (right - left) / 2;
buildArbore(node * 2, left, mid);
buildArbore(node * 2 + 1, mid + 1, right);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
void update(int node, int left, int right){
if(left == right){ //left = a
tree[node] -= b;
return;
}
int mid = left + (right - left) / 2;
if(a <= mid){
update(node * 2, left, mid);
}
else {
update(node * 2, mid + 1, right);
}
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
int query(int node, int left, int right){
if(a <= left && right <= b){
return tree[node];
}
int mid = left + (right - left) / 2;
int rez1 = 0, rez2 = 0;
if(mid >= a){
rez1 = query(node * 2, left, mid);
}
if(mid + 1 <= b){
rez2 = query(node * 2 + 1, mid + 1, right);
}
return rez1 + rez2;
}
int main()
{
int N, M;
fin >> N >> M;
for(int i = 1; i <= N; i++){
fin >> v[i];
}
buildArbore(1, 1, N); //dupa asta nici macar nu mai am nevoie de v[]
delete v;
for(int q = 1; q <= M; q++){
fin >> tip >> a >> b; //variabile globale
if(tip == 0){
//update
//vreau sa sterg b din ziua numarul a
update(1, 1, N);
}
else {
//vreau sa stiu un query de suma pe un interval
fout << query(1, 1, N) << "\n";
}
}
return 0;
}