Pagini recente » Cod sursa (job #1971865) | Cod sursa (job #433959) | Cod sursa (job #280464) | Cod sursa (job #443190) | Cod sursa (job #1950353)
#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 poz) {
int s = 0;
/*
while(k) {
s+= v[k];
k=getParent(k);
}
*/
for (;poz>=1;poz-=(poz&(-poz)))
s+=v[poz];
return s;
}
void binSearch(int st, int dr) {
while(st <= dr) {
int mij = (st + dr) / 2;
int s = sum(mij);
if(s == sumCautata) {
fout<<mij<<'\n';
break;
} else if (s > sumCautata)
dr = mij - 1;
else st = mij + 1;
}
/*
if(st > dr) return;
int mij = st + (dr-st)/2;
int s = sum(mij);
if(s == sumCautata)
fout<<mij<<'\n';
else if(s > sumCautata) {
binSearch(st, mij - 1);
} else {
binSearch(mij + 1, dr);
}
*/
}
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;
}