Pagini recente » Cod sursa (job #96680) | Cod sursa (job #2912105) | Cod sursa (job #1530098) | Cod sursa (job #2003144) | Cod sursa (job #2883345)
// 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");
int n, m;
int v[NMax + 3], aib[NMax + 3];
void input() {
fin >> n >> m;
for (int i = 1; i <= n; ++i) fin >> v[i];
}
void init() {
int p;
for (int i = 1; i <= n; ++i) {
aib[i] = v[i];
p = i & (-i);
for (int k = 1; k < p; k *= 2) aib[i] += aib[i - k];
}
}
void add(int i, int v) {
for (int k = i; k <= n; k += k & (-k)) aib[k] += v;
}
long long getsum(int i) {
long long s = 0;
for (int k = i; k; k -= k & (-k)) s += (long long)aib[k];
return s;
}
void solve() {
int c, a, b;
for (int 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;
int 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();
}