Cod sursa(job #2076389)

Utilizator adystar00Bunea Andrei adystar00 Data 26 noiembrie 2017 15:13:18
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
using namespace std;
int aib[100002],suma,n,m;
int ib (int x)
{
    return x&(-x);
}
void update( int a, int b)
{
    if(a>n)
        return;
    aib[a]+=b;
    a+=ib(a);
    update(a,b);
}
int query (int a)
{
    //cout<<"VF ";
    int suma=0;
    while(a)
    {
        suma+=aib[a];
        a-=ib(a);
    }
    return suma;
}
int cautare(int val)
{
    int pas,i=0;
    for(pas=1; pas<n; pas <<=1);
        while(pas)
        {
            //cout<<pas<<"\n";
            if(i+pas<=n)
            {
                if(val>=aib[i+pas])
                {
                    i=i+pas;
                    val-=aib[i];
                    if(!val)
                        return i;
                }
            }
            pas>>=1;
        }
    return -1;
}
int main()
{
    ifstream fin ("aib.in");
    ofstream fout ("aib.out");
    int m,i,a,b,q;
    fin>>n>>m;
    for(i=1; i<=n; i++)
    {
        fin>>a;
        update(i,a);
    }
    for(i=1; i<=m; i++)
    {
        fin>>q;
        //cout<<q<<"\n";
        if(q==0)
        {
            fin>>a>>b;
            update(a,b);
        }
        else if(q==1)
        {
            fin>>a>>b;
            suma=0;
            fout<<query(b)-query(a-1)<<"\n";
        }
        else
        {
            fin>>a;
            fout<<cautare(a)<<"\n";
        }
    }
    return 0;
}