Pagini recente » Cod sursa (job #756770) | Cod sursa (job #2886073) | Cod sursa (job #1430090) | Cod sursa (job #1878357) | Cod sursa (job #762147)
Cod sursa(job #762147)
#include <iostream>
#include <fstream>
using namespace std;
int n, m, i, j, a, b, op, t, begin, end, mid;
int v[100001], aib[100001];
void add(int x, int quantity) {
int i;
for (i=x; i<=n; ) {
aib[i] += quantity;
i+= i & (-i);
}
}
int compute(int x) {
int i, ret = 0;
for (i=x; i>0; ) {
ret += aib[i];
i-= i & (-i);
}
return ret;
}
int main() {
ifstream f("aib.in");
ofstream g("aib.out");
f>>n>>m;
aib[0]=0; v[0]=0;
for(i=1; i<=n; i++) aib[i]=0; //initializare cu 0
for(i=1; i<=n; i++) { f>>v[i]; add(i, v[i]); } //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 ) g<<begin<<"\n";
else if( compute(end) == a ) g<<end<<"\n";
else if( compute(mid) == a ) g<<mid<<"\n";
else g<<"-1\n";
}
}
f.close();
g.close();
return 0;
}