Cod sursa(job #1226631)

Utilizator akaprosAna Kapros akapros Data 6 septembrie 2014 16:15:53
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int n,i,j,p,q,nr,m,poz;
struct nod
{
    int x;
    int y;
} v[200005];
int w[200005];
int father(int X)
{
    return X/2;
}
int left_son(int X)
{
    return X*2;
}
int right_son(int X)
{
    return X*2+1;
}
void shift(int N,int K)
{
    int son=0;
    do
    {
        son=0;
        if (left_son(K)<=N)
        {
            son=left_son(K);
            if ((v[son].x>v[right_son(K)].x)&&(right_son(K)<=N)) son=right_son(K);
            if (v[son].x>=v[K].x) son=0;
            if (son) swap(w[v[son].y],w[v[K].y]),swap(v[son],v[K]),K=son;
        }
    } while (son);
}
void percolate(int N,int &K)
{
    int k=v[K].x,l1=v[K].y;
    while ((K>1)&&(k<v[father(K)].x))
    {
        w[v[K].y]=father(K);
        w[v[father(K)].y]=K;
        swap(v[K],v[father(K)]);
        K=father(K);
    }
    v[K].x=k; v[K].y=l1;
    w[v[K].y]=l1;
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&m);
    while (m--)
    {
        scanf("%d",&p);
        if (p==1)
        {
            q++;
            scanf("%d",&nr);
            if (n==0) {v[++n].x=nr; v[n].y=q; w[q]=n;}
            else
            {
                v[++n].x=nr; poz=n; v[n].y=q;
                percolate(n,poz);
                w[q]=poz;
            }
        }
        if (p==2)
        {
            scanf("%d",&nr);
            v[w[nr]].x=10000000000;
            shift(n,w[nr]);
            n--;
        }
        if (p==3) printf("%d\n",v[1]);
    }
    return 0;
}