Pagini recente » Cod sursa (job #1119205) | Cod sursa (job #1779929) | Cod sursa (job #1144960) | Cod sursa (job #1220708) | Cod sursa (job #2921619)
#include <fstream>
#include <vector>
#include <cassert>
using namespace std;
int lsb(int x) {
return x & (-x);
}
void update(int p, int val, vector<int>& V) {
for (;p > 0 && p < V.size(); p += lsb(p))
V[p] += val;
}
int query(int p, const vector<int>& V) {
int sum = 0;
for (; p > 0; p -= lsb(p))
sum += V[p];
return sum;
}
int search(int sum, const vector<int>& V) {
int p = lsb(V.size() - 1);
int index = 0, ans = V.size();
for (; p > 0; p >>= 1) {
int newIndex = index | p;
if (newIndex >= V.size())
continue;
if (V[newIndex] < sum) {
sum -= V[newIndex];
index = newIndex;
continue;
}
if (V[newIndex] == sum) {
ans = newIndex;
}
}
return ans < V.size() ? ans : -1;
}
int main() {
ifstream f("aib.in");
ofstream g("aib.out");
int N, M;
f >> N >> M;
int MaxIdx = 1;
for (; MaxIdx < N; MaxIdx <<= 1);
vector<int> V(MaxIdx + 1);
for (int i = 1; i <= N; i++) {
int x;
f >> x;
update(i, x, V);
}
for (int i = 0; i < M; i++) {
int op, a, b;
f >> op >> a;
if (op <= 1)
f >> b;
if (op == 0)
update(a, b, V);
else if (op == 1)
g << query(b, V) - query(a - 1, V) << '\n';
else
g << search(a, V) << '\n';
}
f.close();
g.close();
return 0;
}