Cod sursa(job #2018909)

Utilizator AsttridMocanu Ada Astrid Asttrid Data 6 septembrie 2017 12:39:52
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int p,n,x,h[200001][3],N,l;
void sift(int n,int k)
{int tata,fiu;
tata=k;
fiu=2*k;
while(fiu<=n){
    if(fiu<n)if(h[fiu][1]>h[fiu+1][1])fiu++;
    if(h[tata][1]<h[fiu][1])return;
    swap(h[tata][1],h[fiu][1]);
    swap(h[tata][2],h[fiu][2]);
       tata=fiu;
    fiu=tata*2;
}}


void percolate(int n,int k){
int tata,fiu;
fiu=k;
tata=fiu/2;
while(tata){
 if(h[tata][1]<h[fiu][1])return;
    swap(h[tata][1],h[fiu][1]);
    swap(h[tata][2],h[fiu][2]);
        fiu=tata;
    tata=fiu/2;

}}

int caut(int x){
int st,dr,m;
st=1;dr=n;
while(st<=dr){
m=(st+dr)/2;

if(h[m][2]==x)return m;
if(h[m][2]>x)st=m+1;
if(h[m][2]<x)dr=m-1;

}
}

int main(){
int i,b;n=0;

in>>N;
for(i=1;i<=N;i++){
in>>p;
if(p==1){in>>x;
n++;l++;
h[n][1]=x;
h[n][2]=l;

percolate(n,n);
}
else
if(p==2){in>>x;

b=caut(x);

swap(h[b][1],h[n][1]);
swap(h[b][2],h[n][2]);
n--;
sift(n,1);
}
else
if(p==3){out<<h[1][1]<<endl;
}}
return 0;}