Cod sursa(job #565612)

Utilizator niovanIovan Alexandru niovan Data 27 martie 2011 23:38:45
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#define zero(x) ((x^(x-1))&x)
#define NMax 100001
using namespace std;

fstream fin("aib.in",ios::in);
fstream fout("aib.out",ios::out);

int AIB[NMax],N,M;

void Add(int x,int val)
{
    for(;x<=N;x+=zero(x))
        AIB[x]+=val;

}

int Compute(int x)
{
    int rez=0;
    for(;x>0;x-=zero(x))
        rez+=AIB[x];
    return rez;
}

void Citire()
{
    int i,val;
    fin>>N>>M;
    for(i=1;i<=N;i++)
    {
        fin>>val;
        Add(i,val);
    }
}

int Binar(int val)
{
    int minK=-1,st=1,dr=N,mij,val2;
    while(st<=dr)
            {
                mij=(st+dr)/2;
                val2=Compute(mij);
                if(val2==val)
                {
                    minK=mij;
                    return minK;
                }
                    else if(val2<val) //caut in dreapta
                            st=mij+1;
                            else dr=mij-1; //caut in stanga
            }

    return minK;
}

int main()
{
    int op,st,dr,poz,val;
    Citire();

    while(M--)
    {
        fin>>op;
        switch(op)
        {
            case 0://aduna
            fin>>poz>>val;
            Add(poz,val);
            break;

            case 1://Suma [st,dr]
            fin>>st>>dr;
            fout<<fout<<Compute(dr)-Compute(st-1)<<"\n";
            break;

            case 2://Min K
            fin>>val;
            fout<<Binar(val)<<"\n";
            break;
        }
    }

    return 0;
}