Cod sursa(job #1141939)

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

using namespace std;

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

int n, m, sum[NMAX], aib[NMAX], a[NMAX];

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

void Citeste()
{
    int i;

    f>>n>>m;
    for (i=1; i<=n; ++i)
    {
        f>>a[i];
        sum[i]=sum[i-1]+a[i];
    }
}

void Preprop()
{
    int i;

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

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

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

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=0;

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

        if (query(mij)>=x)
        {
            dr=mij-1;
            sol=mij;
        }
        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;
}