Pagini recente » Cod sursa (job #2566156) | Cod sursa (job #3243782) | Cod sursa (job #1478798) | Cod sursa (job #957812) | Cod sursa (job #2566119)
#include <bits/stdc++.h>
#define MAXN 100005
#define FILENAME std::string("aib")
std::ifstream input (FILENAME+".in");
std::ofstream output(FILENAME+".out");
int N, M;
int AIB[MAXN];
#define NEXT(pos) pos&(-pos)
void update(int pos, int val) {
for (; pos<=N; pos += NEXT(pos))
AIB[pos] += val;
}
int query(int pos) {
if (pos == 0) return 0;
int sum = 0;
for (; pos >0; pos -= NEXT(pos))
sum += AIB[pos];
return sum;
}
int query(int a, int b) { return query(b) - query(a-1); }
void binquery(int sum) {
int left = 1, right = N, mid, ans = -1;
while (left <= right) {
mid = (left+right)/2;
int v = query(mid);
if (v == sum) ans = mid;
if (query(mid) >= sum) right = mid-1;
else left = mid+1;
} output << ans << '\n';
}
int main()
{
input >> N >> M;
for (int i=1, x; i<=N; ++i) input >> x, update(i, x);
for (int i=1, t, a, b; i<=M; ++i) {
input >> t;
if (t == 0) input >> a >> b, update(a, b);
else if (t == 1) input >> a >> b, output << query(a, b) << '\n';
else input >> a, binquery(a);
}
return 0;
}