Pagini recente » Cod sursa (job #1592917) | Cod sursa (job #384814) | Cod sursa (job #208320) | Cod sursa (job #658517) | Cod sursa (job #2272607)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define mp make_pair
#define CHECK(x) if(!(x)) return false;
#define CHECKRET(x, y) if(!(x)) return (y);
#define SKIP(x) if((x)) continue;
typedef pair<int, int> pii;
#ifdef INFOARENA
#define ProblemName "aib"
#else
#define ProblemName "fis"
#endif
#define InFile ProblemName ".in"
#define OuFile ProblemName ".out"
const int MAXN = 100010;
int aib[MAXN];
int N;
inline int lastbit(int x) {
return x & (-x);
}
int query(int pos) {
int ans = 0;
for (; pos > 0; ans += aib[pos], pos -= lastbit(pos));
return ans;
}
void update(int pos, int x) {
for (; pos <= N; aib[pos] += x, pos += lastbit(pos));
}
int query2(int x) {
int l = 1, r = N;
int ans = 0;
int found = -1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (aib[mid] + ans == x) found = mid;
if (aib[mid] + ans >= x) {
ans += aib[mid];
r = mid - 1;
}
else l = mid + 1;
}
return found;
}
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OuFile, "w", stdout));
int M;
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; ++i) {
int x;
scanf("%d", &x);
update(i, x);
}
while (M--) {
int qt;
scanf("%d", &qt);
if (qt == 0) {
int a, x;
scanf("%d%d", &a, &x);
update(a, x);
}
else if (qt == 1) {
int l, r;
scanf("%d%d", &l, &r);
int ans = query(r);
if (l > 1) ans -= query(l - 1);
printf("%d\n", ans);
}
else {
int x;
scanf("%d", &x);
printf("%d\n", query2(x));
}
}
return 0;
}