Pagini recente » Cod sursa (job #2097326) | Cod sursa (job #1392407) | Cod sursa (job #3248590) | Cod sursa (job #50042) | Cod sursa (job #345362)
Cod sursa(job #345362)
#include<stdio.h>
#define Nmax 200005
FILE *fin=fopen("heapuri.in","r"),
*fout=fopen("heapuri.out","w");
int N,A[Nmax],poz[Nmax],heap[Nmax],cnt,Nh;
void swap(int i,int j)
{
heap[i]^=heap[j]^=heap[i]^=heap[j];
poz[heap[i]]=i;poz[heap[j]]=j;
}
void add(int x)
{
heap[++Nh]=x;
poz[cnt]=Nh;
int i=Nh;
while(i/2 && A[heap[i/2]]>A[heap[i]])
{
swap(i,i/2);
i/=2;
}
}
void remove(int x)
{
swap(x,Nh);
Nh--;
int i=x,j;
while(1)
{
j=i*2;
if(j>Nh) return;
if(j+1<=Nh && A[heap[j+1]]<A[heap[j]]) ++j;
if(A[heap[j]]>=A[heap[i]]) return;
swap(j,i);
i=j;
}
}
int main()
{
fscanf(fin,"%d",&N);
for(int i=1;i<=N;i++)
{
int x,y;
fscanf(fin,"%d",&x);
if(x==1)
{
fscanf(fin,"%d",&y);
A[++cnt]=y;
add(cnt);
}
else if(x==2)
{
fscanf(fin,"%d",&y);
remove(poz[y]);
}
else fprintf(fout,"%d\n",A[heap[1]]);
}
return 0;
}