Cod sursa(job #943449)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 25 aprilie 2013 15:15:23
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>

using namespace std;
int a[100005], n, m;

    ofstream cout("aib.out");
void adauga(int poz, int val)
{
    while(poz<=n)
    {
        a[poz]+=val;
        poz += (poz^(poz-1)) & poz  ;
    }
}
int cat(int poz)
{
    int sum=0;
    while(poz>0)
    {
        sum += a[poz];
        poz -= (poz^(poz-1)) & poz  ;
    }
    return sum;
}
int caut_binar(int val){
	int li = 1, ls = n, x, gasit = -1;

	while (li <= ls){
		x = (li+ls) / 2;

		int aa = cat(x);
		if (aa >= val){
			if (aa == val)
				gasit = x;
			ls = x-1;
		}
		else
			li = x+1;
	}

	return gasit;
}
void caut_bin(int val, int li, int ls)
{
    int mij=(li+ls)/2;
    int aa = cat( mij );
    if( li >= ls)
        {cout<<"-1\n"; return ;}

    if(aa == val)
        {cout<<mij<<'\n'; return ; }
    else if( aa > mij )
            caut_bin(val, li, mij-1);
        else caut_bin(val, mij+1, ls);
}
int main()
{
    ifstream cin("aib.in");
    cin>>n>>m;
    for(int i = 1; i <= n ; ++ i)
    {
        int x;
        cin>>x;
        adauga(i, x);
    }
    for(int i = 1 ; i <= m ; ++ i)
    {
        int tip;
        cin>>tip;
        if(tip == 0)
        {
            int pozi, valo;
            cin>>pozi>>valo;
            adauga(pozi, valo);
        }
        else if(tip == 1)
        {
            int first, second;
            cin>>first>>second;
            cout<<cat(second)-cat(first-1)<<'\n';
        }
        else if(tip == 2)
        {
            int value;
            cin>>value;
            cout<<caut_binar(value)<<"\n";
        }

    }
    return 0;
}