Cod sursa(job #1141949)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 13 martie 2014 12:26:27
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#define NMAX 100010

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int n, m, aib[NMAX];

inline int ultim(int x)
{
    return (x^(x-1))&x;
}

void Update(int pz, int x)
{
    int i;

    for (i=pz; i<=n; i+=ultim(i)) aib[i]+=x;
}

void Citeste()
{
    int i, x;

    f>>n>>m;
    for (i=1; i<=n; ++i)
    {
        f>>x;
        Update(i, x);
    }
}

/*void Preprop()
{
    int i;

    for (i=1; i<=n; ++i)
        aib[i]=sum[i]-sum[i-ultim(i)];
}*/

int query(int pz)
{
    int i, sum=0;

    for (i=pz; i>0; i-=ultim(i)) sum+=aib[i];

    return sum;
}

int cauta(int x)
{
    int st=1, dr=n, mij, sol=-1, val;

    while (st<=dr)
    {
        mij=(st+dr)/2;
        val=query(mij);

        if (val==x)
        {
            sol=mij; dr=mij-1;
        }
        else
            if (val>x) dr=mij-1;
            else st=mij+1;
    }

    return sol;
}

void Solve()
{
    int op, x, y, i;

    for (i=1; i<=m; ++i)
    {
        f>>op;

        if (op==0)
        {
            f>>x>>y;
            Update(x, y);
        }
        else
            if (op==1)
            {
                f>>x>>y;
                g<<query(y)-query(x-1)<<"\n";
            }
            else
            {
                f>>x;
                g<<cauta(x)<<"\n";
            }
    }
}

int main()
{
    Citeste();

    //Preprop();

    Solve();

    f.close();
    g.close();
    return 0;
}