Pagini recente » Cod sursa (job #479615) | Cod sursa (job #1504092) | Cod sursa (job #865206) | Cod sursa (job #20449) | Cod sursa (job #2395136)
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
#define zeros(x) ((x ^ (x - 1)) & x)
const int N_MAX = 100001;
int N, M;
int AIB[N_MAX];
void add(int poz, int val) {
for(int i = poz; i <= N; i += zeros(i))
AIB[i] += val;
}
int sum(int poz) {
int res = 0;
for(int i = poz; i > 0; i -= zeros(i))
res += AIB[i];
return res;
}
int search(int val) {
int step;
for(step = 1; step < N; step <<= 1);
for(int i = 0; step > 0; step >>= 1)
if(i + step <= N)
if(val >= AIB[i + step]) {
i += step;
val -= AIB[i];
if(val == 0)
return i;
}
return -1;
}
int main() {
in >> N >> M;
int x;
for(int i = 1; i <= N; ++i) {
in >> x;
add(i, x);
}
int tip, a, b;
for(int i = 1; i <= M; ++i) {
in >> tip >> a;
switch(tip) {
case 0:
in >> b;
add(a, b);
break;
case 1:
in >> b;
out << sum(b) - sum(a - 1) << '\n';
break;
case 2:
out << search(a) << '\n';
}
}
return 0;
}