Cod sursa(job #527606)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 31 ianuarie 2011 22:11:18
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>

using namespace std;

const char iname[] = "aib.in";
const char oname[] = "aib.out";
const int  nmax    = 100007;

ifstream fin(iname);
ofstream fout(oname);

int AIB[nmax], n, m, i, j, poz, adaug, leftind, rightind, sumtobesearched, tip, k, x;
int ret;

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

int query(int pos)
{	
	int i, sol = 0;
	for(i = pos; i > 0; i -= i & -i)
		sol += AIB[i];
	return sol;
}

int search(int what)
{
	int lefty = 1, righty = n;
	int middy;
	while(lefty < righty)
	{
		middy = (lefty + righty) >> 1;
		if(query(middy) > what)
			righty = middy;
		else
			if(query(middy) == what)
				return middy;
			else
				lefty = middy + 1;
	}
	if(query(lefty) == what)
		return lefty;
	else
		if(query(righty) == what)
			return righty;
	else
		return -1;
}



int main()
{
	fin >> n >> m;
	for(i = 1; i <= n; i ++)
	{
		fin >> x;
		update(i, x);
	}
	
	for(i = 1; i <= m; i ++)
	{
		fin >> tip;
		if(tip == 0)
		{
			fin >> poz >> adaug;
			update(poz, adaug);
		}
		else
			if(tip == 1)
			{
				fin >> leftind >> rightind;
				fout << query(rightind) - query(leftind - 1) << "\n";
			}
			else
			{
				fin >> sumtobesearched;
				k = search(sumtobesearched);
				fout << k << "\n";
			}
	}
	return 0;
}