Cod sursa(job #2263258)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 18 octombrie 2018 15:35:11
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 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]=n;
            urca(n);
        }
        else if(c==2)
        {
            in>>nr;
            swap(h[p[nr]],h[n]);
            pp[p[nr]]=pp[n--];
            coboara(p[nr]);
            urca(p[nr]);
        }
        else
            out<<h[1]<<"\n";
    }
    return 0;
}