Cod sursa(job #1473915)

Utilizator IulianBoboUAIC Boboc Iulian IulianBobo Data 20 august 2015 14:49:28
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream>
using namespace std;

#define MAX_N 100001
#define zeros(x) (x^(x-1)&x)

ifstream fin("aib.in");
ofstream fout("aib.out");

int n, m, AIB[MAX_N];
short element[MAX_N];

void add(int index, int quantity)
{
	for (int i = index; i <= n; i += zeros(i))
		AIB[i] += quantity;
}

int sumOfFirst(int index)
{
	int suma = 0;
	for (int i = index; i > 0; i -= zeros(i))
		suma += AIB[i];
	return suma;
}

int binarySearch(int a)
{
	int s = 1, d = n, m;
	while (s <= d)
	{
		m = (s + d) / 2;
		if (sumOfFirst(m) > a){
			d = m-1;
		}
		else if (sumOfFirst(m) < a){
			s = m + 1;
		}
		else return m;
	}
	return -1;
}

void compute()
{
	int tip, a, b;
	fin >> n >> m;

	for (int i = 1; i <= n; ++i)
		fin >> element[i];

	for (int i = 1; i <= n; ++i)
		add(i, element[i]);

	for (int i = 1; i <= m; ++i){
		fin >> tip;
		if (tip == 0){
			fin >> a >> b;
			add(a, b);
		}
		else if (tip == 1){
			fin >> a >> b;
			fout << sumOfFirst(b) - sumOfFirst(a - 1)<<"\n";
		}
		else{
			fin >> a;
			fout << binarySearch(a)<< "\n";
		}
	}

	fin.close();
	fout.close();

}

int main()
{
	compute();
	return 0;
}