Pagini recente » Cod sursa (job #1772518) | Cod sursa (job #218525) | Cod sursa (job #1102830) | Cod sursa (job #1161639) | Cod sursa (job #1311468)
///AIB HOME 07.01
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
void update(vector<int>& t, int val, int i) {
while(i < t.size()) {
t[i] += val;
i += (i & -i);
}
}
int read(vector<int>& t, int i) {
int s = 0;
while(i>0) {
s += t[i];
i -= (i & -i);
}
return s;
}
int searchTree(vector<int>& t, int val) {
int i = 0, step = 1;
while(step < t.size() - 1) {
step *= 2;
}
while(step) {
if(i + step <= t.size() - 1) {///!!!
if(val >= t[i + step]) {
i += step;
val -= t[i];
if(val == 0) return i;
}
}
step >>= 1;
}
return -1;
}
int main() {
ifstream inStr("aib.in");
ofstream outStr("aib.out");
int N, M;
inStr >> N >> M;
///vector<int> a(N+1);
vector<int> t(N+1, 0);
int o;
for(int i=1; i<=N; ++i) {
inStr >> o;
update(t, o, i);
}
int task;
for(int i=0; i<M; ++i) {
inStr >> task;
switch(task) {
case 0:
int x, y;
inStr >> x >> y;
///a[x] += y;
update(t, y, x);
break;
case 1:
int k, l, cx, cy;
inStr >> k >> l;
cy = read(t, l);
cx = read(t, k-1);
outStr << cy - cx << '\n';
break;
case 2:
int m;
inStr >> m;
outStr << searchTree(t, m) << '\n';
break;
}
}
return 0;
}