Pagini recente » Cod sursa (job #451755) | Borderou de evaluare (job #3141578) | Borderou de evaluare (job #2010092) | Borderou de evaluare (job #2357990) | Cod sursa (job #2018909)
#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;}