Pagini recente » Cod sursa (job #654381) | Cod sursa (job #37146) | Cod sursa (job #560265) | Cod sursa (job #399768) | Cod sursa (job #1445799)
#include <cstdio>
#include <cassert>
#include <algorithm>
#define _submit
#ifdef _submit
#define InFile "aib.in"
#define OutFile "aib.out"
#else
#define InFile "fis.in"
#define OutFile "fis.out"
#endif
#define MAXARBSZ 140000
int arbInt[MAXARBSZ];
int arbSz;
int gudSz(int n) {
int p = 1;
while (p < n)
p <<= 1;
return p;
}
void update(int pos, int x) {
pos += arbSz - 1;
while (pos) {
arbInt[pos] += x;
pos >>= 1;
}
}
int query(int left, int right) {
left += arbSz - 1;
right += arbSz - 1;
int result = 0;
while (left <= right) {
if (left & 1)
result += arbInt[left];
if (!(right & 1))
result += arbInt[right];
left = (left + 1) >> 1;
right = (right - 1) >> 1;
}
return result;
}
int query2(int srch) {
int left = 1;
int right = arbSz;
int sum_to_right = arbInt[1];
int curNod = 1;
int found = -1;
while (left <= right && curNod < (arbSz << 1)) {
int mid = (left + right) >> 1;
int sum_to_mid = sum_to_right - arbInt[(curNod << 1) + 1];
if (sum_to_mid == srch) {
found = mid;
right = mid;
sum_to_right = sum_to_mid;// -arbInt[right + arbSz - 1];
curNod <<= 1;
}
else if (sum_to_mid < srch) {
left = mid + 1;
curNod = (curNod << 1) + 1;
}
else if (sum_to_mid > srch) {
right = mid;
sum_to_right = sum_to_mid;// -arbInt[right + arbSz - 1];
curNod <<= 1;
}
}
if (sum_to_right == srch)
return right;
return found;
}
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OutFile, "w", stdout));
int N, M;
scanf("%d%d", &N, &M);
arbSz = gudSz(N);
for (int i = arbSz; i < arbSz + N; i++)
scanf("%d", &arbInt[i]);
for (int i = arbSz + N; i< (arbSz << 1); i++)
arbInt[i] = 0;
for (int i = arbSz - 1; i > 0; i--)
arbInt[i] = arbInt[i << 1] + arbInt[(i << 1) + 1];
for (int i = 0; i < M; i++) {
int o, a, b;
scanf("%d%d", &o, &a);
if (o == 1) {
scanf("%d", &b);
printf("%d\n", query(a, b));
}
else if (o == 0) {
scanf("%d", &b);
update(a, b);
}
else
printf("%d\n", query2(a));
}
return 0;
}