Cod sursa(job #1622390)

Utilizator dezenStefan Brasoveanu dezen Data 1 martie 2016 11:17:48
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int n,o,ind,i,x,q,w,cnt,poz[200001],i1,i2;
struct hip
{
    int val;
    int ord;
} h[200001];
void up(int i)
{
    if(i!= 1 && h[i].val<h[i/2].val)
    {
        i1=h[i].ord;
        i2=h[i/2].ord;
        swap(h[i1],h[i2]);
        swap(poz[i],poz[i/2]);
        up(i/2);
    }
}
void down(int i)
{
     int fiu=0;
     if(2*i<=ind)
     {
         fiu=2*i;
         if(fiu+1 <= ind && h[fiu+1].val <  h[fiu].val)fiu=2*i+1;
         if(h[fiu].val > h[i].val)fiu=0;
     }
     if(fiu)
     {
         i1=h[fiu].ord;
         i2=h[i].ord;
         swap(h[i1],h[i2]);
         swap(poz[i1],poz[i]);
         down(fiu);
     }
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&o);
        if(o == 1)
        {
            scanf("%d",&x);
            ind++;
            cnt++;
            h[ind].val = x;
            h[ind].ord = cnt;
            poz[ind]=cnt;
            up(ind);
        }
        if(o == 2)
        {
            scanf("%d",&x);
            i1=h[x].ord;
            i2=h[ind].ord;
            swap(h[i1],h[i2]);
            swap(poz[i1],poz[i2]);
            up(poz[x]);
            down(poz[x]);
            ind --;
        }
        if(o == 3)printf("%d\n",h[1].val);
    }

}