Cod sursa(job #1562414)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 5 ianuarie 2016 00:58:24
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<bits/stdc++.h>
using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

const int NMAX=200005;

int n,a[NMAX],h[NMAX],poz[NMAX];
int len,cnt;

void swp(int x,int y)
{
    swap(a[x],a[y]);
    swap(h[x],h[y]);
    swap(poz[h[x]],poz[h[y]]);
}

void heapup(int x)
{
    while (x>1 && a[x]<a[x>>1])
    {
        swp(x,x>>1);
        x>>=1;
    }
}

void heapdown(int x)
{
    int mn,pz;
    bool ok=1;
    while (ok)
    {
        mn=1<<30;ok=0;
        if (2*x<=len && a[2*x]<mn) {mn=a[2*x];pz=2*x;}
        if ((2*x+1)<=len && a[2*x+1]<mn) {mn=a[2*x+1];pz=2*x+1;}
        if (mn!=(1<<30))
        {
            ok=1;
            swp(x,pz);
            x=pz;
        }
    }
}

int main()
{
    int i,op,x;
    fin>>n;
    for (i=1;i<=n;i++)
    {
        fin>>op;
        if (op==1)
        {
            fin>>a[++len];
            cnt++;
            h[len]=cnt;
            poz[cnt]=len;
            heapup(len);
        }
        if (op==2)
        {
            fin>>x;
            x=poz[x];
            swap(a[x],a[len]);
            swap(h[x],h[len]);
            swap(poz[h[x]],poz[h[len]]);
            len--;
            heapdown(x);
        }
        if (op==3) fout<<a[1]<<"\n";
    }
    return 0;
}