Cod sursa(job #213729)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 11 octombrie 2008 11:55:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#define lg_max 100010
#define lol ((poz^(poz-1))&poz)

using namespace std;

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

int n,m,sir[lg_max];

void update(int poz,int val)
{
    while (poz<=n)
    {
        sir[poz]+=val;
        poz+=lol;
    }
}

int suma(int poz)
{
    int S=0;
    while (poz>0)
    {
        S+=sir[poz];
        poz-=lol;
    }
    return S;
}

void citire()
{
    fin>>n>>m;
    int val;
    for (int i=0;i<n;i++)
    {
        fin>>val;
        update(i+1,val);
    }
}

int nasol(int S)
{
    //aicea trebe sa aflu suma mpozitia masima care are suma S pana la un interval
    int putere,i;
    for (putere=1;putere<n;putere<<=1);

    for ( i=0; putere!=0 ; putere>>=1)
    {
        if (i+putere<=n)
        {
            if (S>=sir[i+putere])
            {
                S-=sir[i+putere];
                i+=putere;
                if (!S)
                return i;
            }
        }
    }
    return -1;
}

void afisare()
{
    int a,b,c;
    for (int i=0;i<m;i++)
    {
        fin>>a;
        if (a==0)
        {
            fin>>b>>c;
            update(b,c);
        }
        else
        if (a==1)
        {
            fin>>b>>c;
            fout<<suma(c)-suma(b-1);
            fout<<"\n";
        }
        else
        {
            fin>>b;
            fout<<nasol(b);
            fout<<"\n";
        // aicea e nasol :(
        }
    }
}


int main()
{
    citire();
    afisare();
    return 0;
}