Pagini recente » Cod sursa (job #1609336) | Cod sursa (job #3246735) | Cod sursa (job #1711271) | Cod sursa (job #1484664) | Cod sursa (job #3343053)
#include <iostream>
#include <fstream>
std::ifstream fin{"aib.in"};
std::ofstream fout{"aib.out"};
#define MAX_N 100000
int v[MAX_N + 5];
int sp[MAX_N + 5];
int n, m;
void update(const int x, const int p) {
for (int i = p; i <= n; i += (i & -i))
sp[i] += x;
}
int query(const int x) {
int s = 0;
for (int i = x; i > 0; i -= (i & -i))
s += sp[i];
return s;
}
void init() {
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j += (j & -j)) {
sp[j] += v[i];
}
}
}
int binarySearch(int const a) {
int st = 1, dr = n;
while (st <= dr) {
int mij = st + (dr - st) / 2;
const int sum = query(mij);
if (sum < a) {
st = mij + 1;
}
else if (sum > a) {
dr = mij - 1;
}
else {
return mij;
}
}
return st;
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> v[i];
}
init();
for (int i = 0; i < m; i++) {
int c;
fin >> c;
if (c == 0) {
int a, b;
fin >> a >> b;
update(b, a);
}
else if (c == 1) {
int a, b;
fin >> a >> b;
fout << query(b) - query(a - 1) << '\n';
}
else {
int a;
fin >> a;
fout << binarySearch(a) << '\n';
}
}
}