Pagini recente » Cod sursa (job #2604331) | Cod sursa (job #2938124) | Cod sursa (job #3137189) | Cod sursa (job #2040732) | Cod sursa (job #3131443)
#include <fstream>
#include <iostream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
constexpr size_t nmax = 100001;
long long a[nmax], aib[nmax];
void build(int n) {
for (int i = 1; i <= n; ++i) {
int p = i + (i & -i);
if (p <= n)
aib[p] += aib[i];
}
}
long long sum(int n) {
long long rez = 0;
while (n != 0) {
rez += aib[n];
n -= n & -n;
}
return rez;
}
void update(int n, int v, long long val) {
while (v <= n) {
aib[v] += val;
v += v & -v;
}
}
int main() {
int n, m;
in >> n >> m;
for (int i = 1; i <= n; ++i)
in >> a[i], aib[i] = a[i];
build(n);
for (int i = 1; i <= m; ++i) {
int op, st, dr;
in >> op;
if (op == 2) {
int val;
in >> val;
int l = 1, r = n, poz = -1;
while (l <= r) {
int mij = (l + r) / 2;
int su = sum(mij);
if (su == val)
poz = mij;
if (su >= val)
r = mij - 1;
else
l = mij + 1;
}
out << poz << "\n";
continue;
}
in >> st >> dr;
if (op == 0)
update(n, st, dr);
else
out << sum(dr) - sum(st - 1) << "\n";
}
return 0;
}