Mai intai trebuie sa te autentifici.
Cod sursa(job #2904642)
Utilizator | Data | 18 mai 2022 00:27:08 | |
---|---|---|---|
Problema | Datorii | Scor | 80 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 1.54 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int lista[15002];
int arb[600008];
void build (int nod, int s, int d)
{
if (s == d){
arb[nod] = lista[s];
//cout << s << '-'<< d <<' '<< arb[nod] << endl;
}
else{
int mij = (s + d) / 2;
build(2*nod, s, mij);
build(2*nod+1, mij+1, d);
arb[nod] = arb[2*nod] + arb[2*nod+1];
//cout << s << '-'<< d <<' '<< arb[nod] << endl;
}
}
void update (int nod, int s, int d, int indx, int val)
{
if (s == d){
lista[indx] -= val;
arb[nod] -= val;
}
else{
int mij = (s + d) / 2;
if (s <= indx && indx <= mij)
update(2*nod, s, mij, indx, val);
else
update(2*nod+1, mij+1, d, indx, val);
arb[nod] = arb[2*nod] + arb[2*nod + 1];
}
}
int query(int nod, int s, int d, int l, int r)
{
if (r < s || d < l )
return 0;
if (l <= s && d <= r)
return arb[nod];
int mij = (s + d) / 2;
int p1 = query(2*nod, s, mij, l, r);
int p2 = query(2*nod+1, mij+1, d, l, r);
return p1 + p2;
}
int main()
{
int nr, op, i, cod, a, b;
fin >> nr >> op;
for (i = 1; i <= nr; i++)
fin >> lista[i];
build(1, 1, nr);
for (i = 1; i <= op; i++){
fin >> cod >> a >> b;
if (cod == 1)
fout << query(1, 1, nr, a, b) <<"\n";
else
update(1, 1, nr, a, b);
}
return 0;
}