Cod sursa(job #2265845)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 21 octombrie 2018 20:01:08
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>

using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int aint[400001],i,b,a,poz,n,m,c;
void update(int in,int sf,int nod)
{
    if(in==sf)
    {
        aint[nod]=aint[nod]+b;
        return;
    }
    int mij=(in+sf)/2;
    if(mij<poz)
    {
        update(mij+1,sf,2*nod+1);
    }
    else
    {
        update(in,mij,2*nod);
    }
    aint[nod]=aint[2*nod]+aint[2*nod+1];
}
int cauta(int in,int sf,int in2,int sf2,int nod)
{
    if(in==in2 && sf==sf2)
    {
        return aint[nod];
    }
    int mij=(in+sf)/2;
    if(mij<in2)
    {
        return cauta(mij+1,sf,in2,sf2,2*nod+1);
    }
    else if(mij>=sf2)
    {
        return cauta(in,mij,in2,sf2,2*nod);
    }
    else if(mij<=sf && mij>=in)
    {
        return cauta(in,mij,in2,mij,2*nod)+cauta(mij+1,sf,mij+1,sf2,2*nod+1);
    }
}
int cauta2(int in,int sf,int nod)
{
    if(in==sf && aint[nod]==a)
    {
        return in;
    }
    else if(in==sf)
    {
        return -1;
    }
    int mij=(in+sf)/2;
    if(aint[2*nod]<a)
    {
        a-=aint[2*nod];
        return cauta2(mij+1,sf,2*nod+1);
    }
    else
    {
        return cauta2(in,mij,2*nod);
    }
}
int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>a;
        b=a;
        poz=i;
        update(1,n,1);
    }
    while(m--)
    {
        f>>c;
        if(c==0)
        {
            f>>a>>b;
            poz=a;
            update(1,n,1);
        }
        else if(c==1)
        {
            f>>a>>b;
            g<<cauta(1,n,a,b,1)<<'\n';
        }
        else
        {
            f>>a;
            g<<cauta2(1,n,1)<<'\n';
        }
    }
    return 0;
}