Pagini recente » Cod sursa (job #2723415) | Cod sursa (job #255219) | Cod sursa (job #1472710) | Cod sursa (job #3217987) | Cod sursa (job #1791613)
#include <iostream>
#include <fstream>
using namespace std;
int const MAX_N = 100001;
int N, M, tree[MAX_N];
void update(int index, int val) {
while (index <= N) {
tree[index] += val;
index += index & (-index);
}
}
int get_sum(int index) {
int sum = 0;
while (index >= 1) {
sum += tree[index];
index -= index & (-index);
}
return sum;
}
int get_index(int val) {
int i, step;
//gasete prima putere a lui 2 mai mare ca N
for ( step = 1; step < N; step <<= 1 );
//in i se calculeaza ca suma de puteri ale lui 2
for( i = 0; step; step >>= 1 )
{
if( i + step <= N)
{
if( val >= tree[i+step] )
{
i += step, val -= tree[i];
if ( !val ) return i;
}
}
}
return -1;
}
int main() {
ifstream fin("aib.in");
ofstream fout("aib.out");
fin >> N >> M;
//construirea arbore
int val;
for (int i = 1; i <= N; i++) {
fin >> val;
update(i, val);
}
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) - get_sum(a - 1) << '\n';
} else {
int a;
fin >> a;
fout << get_index(a) << '\n';
}
}
fin.close();
fout.close();
return 0;
}