Pagini recente » Cod sursa (job #3147228) | Cod sursa (job #168280) | Cod sursa (job #2306971) | Cod sursa (job #2448184) | Cod sursa (job #1950324)
#include <iostream>
#include <fstream>
#define maxN 100001
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m;
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;
}
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>>x;
int ok = 0;
for(int i = 1; i <= n; i++) {
int p = i;
int s = sum(p);
while(p && mark[p] != i) {
mark[p] = i;
if(s == x) {
fout<<p<<'\n';
ok = 1;
break;
}
s = s - v[p];
p=getParent(p);
}
if(ok == 1)
break;
}
}
}
fin.close();
fout.close();
return 0;
}