Pagini recente » Cod sursa (job #1190295) | Cod sursa (job #2956274) | Cod sursa (job #965839) | Cod sursa (job #661944) | Cod sursa (job #2883352)
// problema aib
// solutie de 100p
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <deque>
using namespace std;
#define NMax 100000
ifstream fin("aib.in");
ofstream fout("aib.out");
long long n, m;
long long v[NMax + 3], aib[2 * NMax + 3];
void input() {
fin >> n >> m;
for (long long i = 1; i <= n; ++i) fin >> v[i];
}
void init() {
long long p;
for (long long i = 1; i <= n; ++i) {
aib[i] = v[i];
p = i & (-i);
for (long long k = 1; k < p; k *= 2) aib[i] += aib[i - k];
}
}
void add(long long i, long long v) {
for (long long k = i; k <= n; k += k & (-k)) aib[k] += v;
}
long long getsum(long long i) {
long long s = 0;
for (long long k = i; k; k -= k & (-k)) s += (long long)aib[k];
return s;
}
void solve() {
long long c, a, b;
for (long long i = 1; i <= m; ++i) {
fin >> c;
if (c == 0) {
fin >> a >> b;
add(a, b);
} else if (c == 1) {
fin >> a >> b;
fout << getsum(b) - getsum(a - 1) << '\n';
} else {
fin >> a;
long long st = 1, dr = n, k = (st + dr) / 2;
for (long long s = getsum(k); s != a && st <= dr; k = (st + dr) / 2, s = getsum(k)) {
if (s < a) st = k + 1;
else if (s > a) dr = k - 1;
}
if (getsum(k) != a) fout << "-1\n";
else fout << k << '\n';
}
}
}
int main() {
input();
init();
solve();
}