Pagini recente » Cod sursa (job #789160) | Cod sursa (job #3257401) | Cod sursa (job #640407) | Cod sursa (job #2343686) | Cod sursa (job #2211789)
#include<iostream>
#include<fstream>
#include "math.h"
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
int n, m;
int A[100001];
void add(int pos, int num) {
while(pos <= n) {
A[pos] += num;
pos += pos & -pos;
}
}
int sum(int pos) {
int s = 0;
while (pos > 0) {
s += A[pos];
pos -= pos & -pos;
}
return s;
}
int mink(int num) {
int step;
step = 1 << (int) log2(n);
for (int i = 0; step != 0; step >>= 1) {
if (i + step <= n) {
if (num >= A[i + step]) {
i += step;
num -= A[i];
if (num == 0)
return i;
}
}
}
return -1;
}
void prv() {
for (int i = 1; i <= n; i++) {
cout << A[i] << ' ';
}
cout << '\n';
}
int main() {
fi >> n >> m;
int op, a, b;
int x, y;
for (int i = 1; i <= n; i++) {
fi >> a;
add(i, a);
}
for (int i = 1; i <= m; i++) {
fi >> op;
switch (op) {
case 0:
fi >> a >> b;
add(a, b);
break;
case 1:
fi >> a >> b;
fo << sum(b) - sum(a - 1) << "\n";
break;
case 2:
fi >> a;
fo << mink(a) << '\n';
break;
}
}
fi.close();
fo.close();
return 0;
}