Pagini recente » Cod sursa (job #397871) | Cod sursa (job #68616) | Cod sursa (job #259514) | Cod sursa (job #1337156) | Cod sursa (job #2468624)
#include <bits/stdc++.h>
#define N (int) (1e5+5)
using namespace std;
int n, m, op, a, b;
int aib[N];
void update(int pos, int add) {
for (int i = pos; i <= n; i += i&(-i))
aib[i] += add;
}
int query(int pos) {
int ret = 0;
for (int i = pos; i >= 1; i -= i&(-i))
ret += aib[i];
return ret;
}
int query2(int l, int r) {
return query(r) - query(l-1);
}
int binarySearch(int left, int right, int val) {
if (left > right) return -1;
int mid = (left + right) / 2;
int sum1mid = query(mid);
if (sum1mid == val) {
int leftBest = binarySearch(left, mid-1, val);
if (leftBest == -1) return mid;
return leftBest;
}
if (sum1mid > val) return binarySearch(left, mid-1, val);
else return binarySearch(mid+1, right, val);
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a);
update(i, a);
}
for (int i = 1; i <= m; ++i) {
scanf("%d", &op);
if (op == 0) {
scanf("%d %d", &a, &b);
update(a, b);
} else if (op == 1) {
scanf("%d %d", &a, &b);
printf("%d\n", query2(a, b));
} else {
scanf("%d", &a);
printf("%d\n", binarySearch(1, n, a));
}
}
return 0;
}