Pagini recente » Cod sursa (job #2667345) | Cod sursa (job #762153)
Cod sursa(job #762153)
#include <iostream>
#include <fstream>
using namespace std;
int n, m, i, j, a, b, op, t, begin, end, mid, v;
int aib[100001];
void add(int x, int quantity) {
int i=x;
while(i<=n) {
aib[i] += quantity;
i+= i & (-i);
}
}
int compute(int x) {
int i=x, ret = 0;
while(i>0) {
ret += aib[i];
i-= i & (-i);
}
return ret;
}
int main() {
ifstream f("aib.in");
ofstream g("aib.out");
f>>n>>m;
for(i=1; i<=n; i++) { aib[i]=0; }
for(i=1; i<=n; i++) { f>>v; add(i, v); } //bag primele valori
for(t=1; t<=m; t++) {
f>>op;
if(op==0) { //adaug b pe pozitia a
f>>a>>b;
add(a,b);
}
if(op==1) { //calculez suma din [a,b] cu formula compute(b)-compute(a-1)
f>>a>>b;
g<<compute(b)-compute(a-1)<<"\n";
}
if(op==2) { //caut binar o pozitie i pentru care compute(i) = a
f>>a;
begin=0;
end=n+1;
while(end-begin>1) {
mid = begin + (end-begin)/2;
if(compute(mid) > a) end=mid;
else begin=mid;
}
if( compute(begin) == a && begin != 0) g<<begin<<"\n";
else g<<"-1\n";
}
}
f.close();
g.close();
return 0;
}