Cod sursa(job #1791597)

Utilizator RobertSSamoilescu Robert RobertS Data 29 octombrie 2016 15:30:21
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#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;
}