Pagini recente » Cod sursa (job #2311342) | Cod sursa (job #728697) | Cod sursa (job #3250623) | Cod sursa (job #3223642) | Cod sursa (job #2218860)
#include <fstream>
#include <cmath>
using namespace std;
#define MAX_N 100001
ifstream fIn("aib.in");
ofstream fOut("aib.out");
int bit[MAX_N], n, numQueries;
void updateBIT(int pos, int val) {
for (; pos <= n; pos += (pos & (~pos + 1))) {
bit[pos] += val;
}
}
int getSum(int posX, int posY) {
int sum = 0;
for (; posY; posY -= (posY & (~posY + 1))) {
sum += bit[posY];
}
for (--posX; posX; posX -= (posX & (~posX + 1))) {
sum -= bit[posX];
}
return sum;
}
int searchForSum(int sum) {
int step = (1 << 16);
for (register int pos = 0; step; step >>= 1) {
int newPos = pos + step;
if (newPos <= n && sum >= bit[newPos]) {
if (sum == bit[newPos]) {
return newPos;
}
sum -= bit[newPos];
pos = newPos;
}
}
return -1;
}
int main() {
char op;
int x, y;
fIn >> n >> numQueries;
for (register int i = 1; i <= n; ++i) {
fIn >> x;
updateBIT(i, x);
}
for (register int i = 0; i < numQueries; ++i) {
fIn >> op;
switch (op) {
case '0':
fIn >> x >> y;
updateBIT(x, y);
break;
case '1':
fIn >> x >> y;
fOut << getSum(x, y) << '\n';
break;
case '2':
fIn >> x;
fOut << searchForSum(x) << '\n';
break;
}
}
return 0;
}