Pagini recente » Cod sursa (job #2148616) | Cod sursa (job #3131225) | Cod sursa (job #1150000) | Cod sursa (job #438180) | Cod sursa (job #763223)
Cod sursa(job #763223)
#include <iostream>
#include <fstream>
using namespace std;
int n, m, aib[15005];
void modifica(int poz, int val, char semn) {
int i=poz;
while(i<=n) {
if(semn=='+') aib[i]+=val; //ca sa nu folosesc o functie de adunat si una de scazut
if(semn=='-') aib[i]-=val; //folosesc una singura care primeste ca parametru si operatia efectuata
i += (i & -i);
}
}
int compute(int poz) {
int rez=0, i=poz;
while(i>0) {
rez+=aib[i];
i -= (i & -i);
}
return rez;
}
int main() {
ifstream f("datorii.in");
ofstream g("datorii.out");
int i, j, op, a, b;
f>>n>>m;
for(i=1; i<=n; i++) aib[i]=0; //initializare
for(i=1; i<=n; i++) {
f>>j;
modifica(i, j, '+'); //pe poz. i se pune valoarea j
}
for(int t=1; t<=m; t++) {
f>>op>>a>>b;
if(op==0) modifica(a, b, '-'); //s-a achitat plata -> trebuie scazut din arbore
else g<<compute(b)-compute(a-1)<<"\n"; //se cere suma din intervalul [a,b]
}
f.close();
g.close();
return 0;
}