Pagini recente » Cod sursa (job #1076726) | Cod sursa (job #2752794) | Cod sursa (job #1340310) | Cod sursa (job #2154727) | Cod sursa (job #1791597)
#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 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
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) << '\n';
}
}
fin.close();
fout.close();
return 0;
}