Cod sursa(job #2492610)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 15 noiembrie 2019 00:12:47
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <iostream>
using namespace std;

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

int v[200010],chron[200010],i,j,cnt,poz[200010],c,x,n,m;

int main(){
    fin>>m;
    for(int k=1;k<=m;k++){
        fin>>c;

        if(c==1){
            fin>>x;
            chron[++cnt]=x;
            v[++n]=cnt;
            poz[cnt]=n;

            i=n;

            while(i/2 && chron[v[i]]<chron[v[i/2]]){
                swap(poz[v[i]],poz[v[i/2]]);
                swap(v[i],v[i/2]);
                i/=2;
            }
        }

        if(c==2){
            fin>>x;

            i=poz[x];
            while(i/2){
                swap(poz[v[i]],poz[v[i/2]]);
                swap(v[i],v[i/2]);
                i/=2;
            }

            v[1]=v[n];
            n--;
            poz[v[1]]=1;

            i=1;
            while(2*i<=n){
                if(chron[v[i]]>chron[v[2*i]] || chron[v[i]]>chron[v[2*i+1]]){
                    if(2*i+1<=n){
                        if(chron[v[2*i+1]]<chron[v[2*i]]){
                            swap(poz[v[i]],poz[v[2*i+1]]);
                            swap(v[i],v[2*i+1]);
                        }else{
                            swap(poz[v[i]],poz[v[2*i]]);
                            swap(v[i],v[2*i]);
                        }
                    }else{
                        if(chron[v[i]]>chron[v[2*i]]){
                            swap(poz[v[i]],poz[v[2*i]]);
                            swap(v[i],v[2*i]);
                        }else
                            break;
                    }
                }else
                    break;
            }
        }

        if(c==3){
            fout<<chron[v[1]]<<"\n";
        }

//        for(i=1;i<=n;i++)
//            cout<<v[i]<<" ";
//        cout<<"\n";
    }

    return 0;
}