Pagini recente » Cod sursa (job #254365) | Cod sursa (job #3216910) | Cod sursa (job #3215443) | Cod sursa (job #530602) | Cod sursa (job #1950359)
#include <iostream>
#include <fstream>
#define maxN 100001
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m, sumCautata;
int v[maxN];
int mark[maxN];
int getParent(int k) {
return (k&(k-1));
}
int nextNode(int k) {
return k + (k & -k);
}
void update(int pos, int val) {
while(pos <= n) {
v[pos] += val;
pos = nextNode(pos);
}
}
int sum(int k) {
int s = 0;
while(k) {
s+= v[k];
k=getParent(k);
}
return s;
}
void binSearch(int st, int dr) {
bool ok = false;
while(st <= dr) {
int mij = (st + dr) / 2;
int s = sum(mij);
if(s == sumCautata) {
fout<<mij<<'\n';
ok = true;
break;
} else if (s > sumCautata)
dr = mij - 1;
else st = mij + 1;
}
if(ok == false) {
fout<<"-1\n";
}
}
int main()
{
fin>>n>>m;
int x, y, op;
for(int i = 1; i <= n; i++) {
fin>>x;
update(i, x);
}
for(int j = 1; j <= m; j++) {
fin>>op;
if(op == 0) {
fin>>x>>y;
update(x, y);
} else if(op == 1) {
fin>>x>>y;
fout<<sum(y) - sum(x - 1)<<'\n';
} else {
fin>>sumCautata;
binSearch(1, n);
}
}
fin.close();
fout.close();
return 0;
}