Pagini recente » Cod sursa (job #1541645) | Cod sursa (job #2513714) | Cod sursa (job #965158) | Cod sursa (job #1545895) | Cod sursa (job #2627714)
#include <bits/stdc++.h>
#define LAST_ONE_BIT ((poz ^ (poz - 1)) & poz)
using namespace std;
using ll = long long;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m, aib[100100], c, a, b;
void update(int poz, int change) {
for (; poz <= n; poz += LAST_ONE_BIT)
aib[poz] += change;
}
int query(int poz) {
if (poz == 0)
return 0;
return aib[poz] + query(poz - LAST_ONE_BIT);
}
int bin_search(int want_sum) { /// cautarea binara a lui Patrascu
ll pas = 1;
for (; pas < n; pas <<= 1);
int poz = 0;
for (; pas; pas >>= 1)
if (poz + pas <= n)
if (aib[poz + pas] <= want_sum) {
poz += pas;
want_sum -= aib[poz];
}
if (poz == 0 || want_sum != 0)
return -1;
return poz;
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> a;
update(i, a);
}
for (int i = 1; i <= m; i++) {
fin >> c;
if (c == 0) {
fin >> a >> b;
update(a, b);
} else if (c == 1) {
fin >> a >> b;
fout << query(b) - query(a - 1) << '\n';
} else {
fin >> a;
fout << bin_search(a) << '\n';
}
}
return 0;
}