Pagini recente » Cod sursa (job #1928241) | Cod sursa (job #2699002) | Cod sursa (job #564668) | Cod sursa (job #491259) | Cod sursa (job #2901873)
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdint>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m;
int v[100005];
void Update(int pos, uint32_t val) {
for (; pos <= n; pos += pos & (-pos)) {
v[pos] += val;
}
}
uint32_t Query(uint32_t pos) {
uint32_t sum = 0;
for (; pos > 0; pos -= pos & (-pos)) {
sum += v[pos];
}
return sum;
}
uint32_t Query(int a, int b) {
return Query(b) - Query(a - 1);
}
uint32_t BinarySearch(uint32_t val) {
uint32_t sum = 0;
int idx = 0;
uint32_t pow = 1 << (int)(log2(n));
while (pow > 0) {
if (idx + pow <= n && sum + v[idx + pow] <= val) {
sum += v[idx + pow];
idx += pow;
}
pow /= 2;
}
if (sum != val) {
return -1;
}
return idx;
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++) {
uint32_t val;
fin >> val;
Update(i, val);
}
for (int i = 1; i <= m; i++) {
int t, a, b;
fin >> t;
if (t == 0) {
fin >> a >> b;
Update(a, b);
}
else if (t == 1) {
fin >> a >> b;
fout << Query(a, b) << '\n';
}
else {
fin >> a;
fout << BinarySearch(a) << '\n';
}
}
}