Pagini recente » Atasamentele paginii Beri | Cod sursa (job #2700661) | Cod sursa (job #1513462) | Cod sursa (job #2141212) | Cod sursa (job #1791593)
#include <iostream>
#include <fstream>
using namespace std;
int const MAX_N = 100001;
int N, M, tree[MAX_N], v[MAX_N];
void update(int index, int val) {
index += 1;
while (index <= N) {
tree[index] += val;
index += index & (-index);
}
}
int get_sum(int index) {
int sum = 0;
index += 1;
while (index > 0) {
sum += tree[index];
index -= index & (-index);
}
return sum;
}
int get_index(int a, int li, int ls) {
if (li == ls) return li;
int lm = li + (ls - li) / 2;
if (get_sum(lm - 1) > a) return get_index(a, li, lm - 1);
else if (get_sum(lm - 1) < a) return get_index(a, lm + 1, ls);
return lm;
}
int main() {
ifstream fin("aib.in");
ofstream fout("aib.out");
fin >> N >> M;
//construirea arbore
for (int i = 0; i < N; i++) {
fin >> v[i];
update(i, v[i]);
}
for (int j = 1; j <= M; j++) {
int type;
fin >> type;
if (type == 0) {
int a, b;
fin >> a >> b;
update(a, b);
} else if (type == 1) {
int a, b;
fin >> a >> b;
fout << get_sum(b - 1) - get_sum(a - 2) << '\n';
} else {
int a;
fin >> a;
fout << get_index(a, 1, N) << '\n';
}
}
fin.close();
fout.close();
return 0;
}