Cod sursa(job #905918)

Utilizator valentina506Moraru Valentina valentina506 Data 6 martie 2013 12:14:21
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<fstream>
using namespace std;
ofstream g("aib.out");

int n,m,arb[100001],i,x,tip;
void adauga(int poz,int x)
{
    int pozbit=0;
    while(poz<=n)
    {
        arb[poz]+=x;
        while(!(poz&(1<<pozbit)))
            pozbit++;
        poz+=(1<<pozbit);
        pozbit+=1;
    }
}

int raspuns(int poz)
{
    int pozbit=0,suma=0;
    while(poz>0)
    {
        suma+=arb[poz];
        while(!(poz&(1<<pozbit)))
            pozbit++;
        poz-=(1<<pozbit);
        pozbit+=1;
    }
    return suma;
}

int cauta(int x)
{

    int st,dr,mij,s;
    st=1,dr=n;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        s=raspuns(mij);
        if(s==x)
            return mij;
        if(s<x)
            st=mij+1;
        else
            dr=mij-1;
    }
    return -1;
}
int main()
{
    ifstream f("aib.in");
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>x;
        adauga(i,x);
    }
    while(m--)
    {
        f>>tip;

        if(tip==0)
        {
            int x,y;
            f>>x>>y;
            adauga(x,y);
        }
        else
            if(tip==1)
            {
                int x,y;
                f>>x>>y;
                g<<raspuns(y)-raspuns(x-1)<<'\n';
            }
            else
                if(tip==2)
                {
                    int x;
                    f>>x;
                    g<<cauta(x)<<'\n';
                }
    }

    return 0;
}