Cod sursa(job #1013125)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 20 octombrie 2013 13:11:14
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define DN 200005
using namespace std;

int arb[DN],v[DN],m;

void update(int poz)
{
    for(; arb[poz/2] > arb[poz] && poz!=1 ; poz/=2)
        swap(arb[poz/2],arb[poz]);
}
int caut(int nod,int &x)
{
    if(arb[nod]==x)
        return nod;
    if(arb[2*nod] >= x)
        return caut(2*nod,x);
    if(arb[2*nod+1] >= x)
       return caut(2*nod+1,x);
}
void sift(int nod)
{

    int x=min(arb[2*nod],arb[2*nod+1]);
    if(arb[nod] > x)
    {
        if(x==arb[2*nod]){

            swap(arb[nod],arb[2*nod]);
            sift(2*nod);
        }
        else{

            swap(arb[nod],arb[2*nod+1]);
            sift(2*nod+1);
        }
    }

}

int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    f>>m;
    memset(arb,127,sizeof(arb));
    arb[0]=0;
    for(;m;--m)
    {
        int op,x;
        f>>op;
        if(op==1)
        {
            f>>x;
            arb[++arb[0]] = x;
            v[++v[0]]=x;
            update(arb[0]);

        }
        if(op==2)
        {
            f>>x;
            x=v[x];
            int nod=caut(1,x);

            swap(arb[nod],arb[ arb[0] ]);
            arb[ arb[0] ]=1<<30;
            --arb[0];
            sift(nod);


        }
        if(op==3)
            g<<arb[1]<<"\n";


    }

    return 0;
}