Pagini recente » Cod sursa (job #239856) | Cod sursa (job #1636995) | Cod sursa (job #760171) | Cod sursa (job #2051435) | Cod sursa (job #951109)
Cod sursa(job #951109)
#include <fstream>
#define INF 1000000000
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n;
int h[200011];
struct valori{
int num;
int poz;
};
valori v[200011];
int main(void){
register int i,j,t,x,k=0,p,c,aux;
f>>n;
f>>t>>v[1].num;
h[1]=1;
k=1;
h[0]=1;
for(i=2;i<=n;i++){
f>>t;
if(t==1){
f>>x;
v[++k].num=x;
v[k].poz=++h[0];
h[h[0]]=k;
c=h[0];
p=h[0]/2;
while(p>0 && v[h[p]].num>v[h[c]].num){
aux=v[h[p]].poz;
v[h[p]].poz=v[h[c]].poz;
v[h[c]].poz=aux;
aux=h[p];
h[p]=h[c];
h[c]=aux;
c=p;
p/=2;
}
continue;
}
if(t==2){
f>>x;
c=v[x].poz;
v[x].num=-1;
p=c/2;
while(p>0 && v[h[p]].num>v[h[c]].num){
aux=v[h[p]].poz;
v[h[p]].poz=v[h[c]].poz;
v[h[c]].poz=aux;
aux=h[p];
h[p]=h[c];
h[c]=aux;
c=p;
p=c/2;
}
h[1]=h[h[0]];
h[0]--;
p=1,c=2;
if(c+1<=h[0] && v[h[c+1]].num<v[h[c]].num)
c++;
while(v[h[p]].num>v[h[c]].num && c<=h[0]){
aux=v[h[p]].poz;
v[h[p]].poz=v[h[c]].poz;
v[h[c]].poz=aux;
aux=h[p];
h[p]=h[c];
h[c]=aux;
p=c;
c=2*p;
if(c+1<=h[0] && v[h[c+1]].num<v[h[c]].num)
c++;
}
continue;
}
g<<v[h[1]].num<<"\n";
}
return 0;
}