Cod sursa(job #2263343)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 18 octombrie 2018 17:03:14
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include<bits/stdc++.h>
//#define x first
//#define y second
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int h[200002],p[200002],pp[200002],n;
void urca(int x)
{
    while(x>1&&h[x]<h[x/2])
    {
        swap(h[x],h[x/2]);
        swap(p[pp[x]],p[pp[x/2]]);
        swap(pp[x],pp[x/2]);
        x/=2;
    }
}
void coboara(int x)
{
    int nr=x;
    if(2*x<=n&&h[nr]>h[2*x])
        nr=2*x;
    if(2*x+1<=n&&h[nr]>h[2*x+1])
        nr=2*x+1;
    if(nr!=x)
    {
        swap(h[x],h[nr]);
        swap(p[pp[x]],p[pp[nr]]);
        swap(pp[x],pp[nr]);
        return coboara(nr);
    }
}
int main()
{
    int q,nn=0,i,c,nr;
    in>>q;
    while(q--)
    {
        in>>c;
        if(c==1)
        {
            in>>nr;
            h[++n]=nr;
            p[++nn]=n;
            pp[n]=nn;
            urca(n);
        }
        else if(c==2)
        {
            in>>nr;
            if(p[nr]==n)
            {
                n--;
                continue;
            }
            h[p[nr]]=h[n];
            pp[p[nr]]=pp[n];
            p[pp[p[nr]]]=p[nr];
            nr=pp[p[nr]];
            coboara(p[nr]);
            urca(p[nr]);
        }
        else
            out<<h[1]<<"\n";
    }
    return 0;
}