Cod sursa(job #1081240)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 13 ianuarie 2014 13:29:18
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<fstream>
#define NMAX 100010

using namespace std;

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

int n, m, a[NMAX];

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

int suma(int lim, int pz)
{
    int sum=0;

    for (; pz>lim; pz-=ultim(pz)) sum+=a[pz];

    return sum;
}

void Citeste()
{
    int i;

    f>>n>>m;

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

        a[i]+=suma(i-ultim(i), i-1);
    }
}

void Update(int pz, int val)
{
    for (; pz<=n; pz+=ultim(pz)) a[pz]+=val;
}

void Solve()
{
    int op, st, dr, mij, gas, x, y, S;

    while (m--)
    {
        f>>op;

        if (op==0)
        {
            f>>x>>y;

            Update(x, y);
        }
        else
            if (op==1)
            {
                f>>x>>y;

                g<<suma(0, y)-suma(0, x-1)<<"\n";
            }
            else
            {
                f>>x;
                st=1; dr=n; gas=-1;

                while (st<=dr)
                {
                    mij=(st+dr)/2;
                    S=suma(0, mij);

                    if (S==x)
                    {
                        gas=mij;
                        break;
                    }
                    else
                        if (S>x) dr=mij-1;
                        else st=mij+1;
                }

                g<<gas<<"\n";
            }
    }
}

int main()
{
    Citeste();

    Solve();

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