Cod sursa(job #2003486)

Utilizator AndreidgDragomir Andrei Valentin Andreidg Data 22 iulie 2017 23:22:33
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#define zeros(x) ( (x ^ (x - 1)) & x )

using namespace std;

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

int n,k;
int vect[100005];

void Add(int pos,int x)
{
    for(int i = pos; i <= n; i += zeros(i))
        vect[i]+=x;
}

int Compute(int x)
{
    int i, ret = 0;

    for (i = x; i > 0; i -= zeros(i))
    {
        ret += vect[i];
        //g<<vect[i]<<" ";
    }
    //g<<"\n\n";
    return ret;
}

int binSearch(int sum)
{
    int st = 1,dr = n,pos, mij = n,s;
    bool ok = 0;
    pos = n;
    if(vect[mij]==sum)
        return n;

    while(st <= dr && mij > 0)
    {
        mij = (st +dr) / 2;
        s = Compute(mij);
        //g<<st<<" "<<mij<<" "<<dr<<"\n";
        if(s > sum)
        {
            //if(dr > mij) {dr = mij}
            dr = mij - 1;
        }
        else
        {
            if(s ==  sum)
            {
                pos = min(pos,mij);
                dr = mij -1;
                ok = 1;
            }
            else
            {
                st = mij +1;
            }
        }
    }

    if(ok)
        return pos;
    else
        return -1;
}
int x,a,b;

int main()
{
    f>>n>>k;

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

    for(int i = 1; i <= k; i++)
    {
        f>>x;

        if(x==0)
        {
            f>>a>>b;
            Add(a,b);
            continue;
        }

        if(x==1)
        {
            f>>a>>b;
            //g<<a<<" "<<b<<"\n";
            g<<Compute(b)- Compute(a-1)<<"\n";
            continue;
        }

        if(x==2)
        {
            f>>a;
            g<<binSearch(a)<<"\n";
            continue;
        }

    }

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