Cod sursa(job #1058405)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 15 decembrie 2013 15:01:30
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 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;
}