Cod sursa(job #1511429)

Utilizator bogdanciurezubogdan ciurezu bogdanciurezu Data 26 octombrie 2015 19:10:17
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
vector <int> aib;
int n, m;

void update(int elm, int val){
	int i = elm;
	for(; i <= n; i += (i & (-i) ) ) aib[i] += val;
}

int querry(int i){
	int sum = 0;
	for(; i > 0; i -= (i & (-i) ) ) sum += aib[i];

	return sum;
}

int primaSec(int suma){
	int dreapta = n, stanga = 1, mij, pot;

	while(stanga < dreapta){
		mij = (stanga + dreapta) / 2;

		pot = querry(mij);
		if(pot == suma)
			return mij;
		else if(pot > suma)
			dreapta = mij - 1;
		else stanga = mij + 1;


	}

	if(querry(stanga) == suma)
		return stanga;

	return -1;
}

int main(){
	int x, q, y;
	f>>n>>m;
	aib.resize(n + 1, 0);

	for(int i = 1; i <= n; ++i){
		f>>x;
		update(i, x);
	}

	for(int i = 1; i <= m; ++i){
		f>>q;

		if(q < 2){
			f>>x>>y;

			if(!q){
				update(x, y);
			}
			else{
				g<<querry(y) - querry(x - 1)<<'\n';
			}
		}
		else{
			f>>x;
			g<<primaSec(x)<<'\n';
		}
	}
	return 0;
}