Pagini recente » Cod sursa (job #1405437) | Cod sursa (job #2972231) | Cod sursa (job #2858037) | Cod sursa (job #2558110) | Cod sursa (job #2589580)
#include <fstream>
const int L = 17;
int aib[100001];
constexpr int LSB(int p) {
return p & (-p);
}
int cauta(int n, int x) {
if (x == 0) {
return -1;
}
int p = 0, pas = 1 << L;
while (pas != 0) {
if (p + pas <= n && aib[p + pas] <= x) {
p += pas;
x -= aib[p];
}
pas >>= 1;
}
if (x != 0) {
return -1;
}
return p;
}
int query(int n, int p) {
int s = 0;
while (p != 0) {
s += aib[p];
p -= LSB(p);
}
return s;
}
void update(int n, int p, int val) {
while (p <= n) {
aib[p] += val;
p += LSB(p);
}
}
int main() {
std::ifstream fin("aib.in");
std::ofstream fout("aib.out");
int n, m;
fin >> n >> m;
for (int i = 1; i <= n; i++) {
int x;
fin >> x;
update(n, i, x);
}
for (; m > 0; m--) {
int op;
fin >> op;
switch (op) {
case 0: {
int a, b;
fin >> a >> b;
update(n, a, b);
break;
}
case 1: {
int a, b;
fin >> a >> b;
fout << query(n, b) - query(n, a - 1) << '\n';
break;
}
case 2: {
int a;
fin >> a;
fout << cauta(n, a) << '\n';
break;
}
}
}
return 0;
}