Cod sursa(job #2633090)

Utilizator Leonard123Mirt Leonard Leonard123 Data 6 iulie 2020 14:14:51
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
#define maxn 500005
#define pb push_back
using namespace std;
int m,o,x,k,n,v[maxn],poz[maxn],heap[maxn];

ifstream cin("heapuri.in");
ofstream cout("heapuri.out");

void push(int x){
    poz[++n]=x;
    v[n]=++k;
    heap[k]=n;
    x=k;
    while(x!=1&&poz[heap[x/2]]>poz[heap[x]]){
       swap(v[heap[x/2]],v[heap[x]]);
       swap(heap[x/2],heap[x]);
       x=x/2;
    }
}

void pop(int x){
    int p=v[x],son;
    poz[x]=-1;
    while(p!=1){
        swap(v[heap[p]],v[heap[p/2]]);
        swap(heap[p],heap[p/2]);
        p/=2;
    }
   swap(v[heap[1]],v[heap[k]]);
   swap(heap[1],heap[k]);
   p=1;son=p;
   k--;
   while(son){
       son=0;
       if(k>\=2*p&&poz[heap[2*p]]<poz[heap[p]])
           son=2*p;
       if(k>=2*p+1&&poz[heap[2*p+1]]<poz[heap[p]]&&poz[heap[2*p+1]]<poz[heap[2*p]])
           son=2*p+1;
       if(son)
            swap(v[heap[son]],v[heap[son/2]]),
            swap(heap[son],heap[son/2]);
       p=son;
   }
}

int main(){
    cin>>m;
    while(m--){
        cin>>o;
        if(o<3)
            cin>>x;
        switch(o){
            case 1 : push(x); break;
            case 2 : pop(x); break;
            case 3 : cout<<poz[heap[1]]<<'\n'; break;
         }
    }
    return 0;
}