Pagini recente » Cod sursa (job #1212734) | Cod sursa (job #64895) | Cod sursa (job #983500) | Cod sursa (job #2548583) | Cod sursa (job #1027555)
#include <stdio.h>
#include <utility>
using namespace std;
FILE *f=fopen("heapuri.in","r");
FILE *g=fopen("heapuri.out","w");
struct nod{
int x;
int y;
}h[2000005];
int n,m,i,ct,x,ii;
void combheap(int i,int n)
{
int v=h[i].x;
int tata=i;
int fiu=2*i;
while(fiu<=n)
{
if (fiu<n) if (h[fiu].x>h[fiu+1].x)fiu++;
if (v>h[fiu].x)
{
h[tata]=h[fiu];
tata=fiu;
fiu=fiu*2;
}
else fiu=n+1;
}
h[tata].x=v;
}
void cern (int n,int k)
{
int fiu=1;
while(fiu){
fiu=0;
if (2*k<=n){
fiu=2*k;
if(2*k+1<=n && h[2*k+1].x>h[2*k].x)fiu=2*k+1;
if (h[fiu].x>h[k].x)fiu=0;
if (fiu){swap(h[k],h[fiu]);k=fiu;}
}
}
}
void urc(int n,int k)
{int nr=h[k].x;
while((k>1) &&(h[k].x<h[k/2].x)) {
h[k]=h[k/2];
k=k/2;
}
h[k].x=nr;
}
void cut(int &n,int k)
{
int tata=k/2;
h[k]=h[n];
n--;
if ((k>1) && (h[k].x>h[tata].x)) urc(n,k);
else cern(n,k);
}
void insert(int n,int xx)
{
int fiu=++n;
int tata=n/2;
while(tata && h[tata].x>xx)
{
h[fiu]=h[tata];
fiu=tata;
tata=fiu/2;
}
h[fiu].x=xx;
h[fiu].y=ct;
}
int extragmin(int &n)
{
int v=h[1].x;
h[1]=h[n];
n--;
combheap(1,n);
return v;
}
int main()
{
ct=0;
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)
{
fscanf(f,"%d",&m);
if (m==1){fscanf(f,"%d",&x);insert(ct,x);ct++;}
else if (m==2){fscanf(f,"%d",&x);for(ii=1;ii<=ct;ii++)if (h[ii].y==x+1){cut(ii,n);break;}}
else if (m==3)fprintf(g,"%d\n",extragmin(ct));
}
fclose(g);
return 0;
}