Pagini recente » Cod sursa (job #376548) | Cod sursa (job #171401) | Cod sursa (job #2045286) | Cod sursa (job #168019) | Cod sursa (job #238850)
Cod sursa(job #238850)
#include<stdio.h>
FILE*fin=fopen("heapuri.in","r");
FILE*fout=fopen("heapuri.out","w");
#define nmax 200001
int heap[nmax],dim=0,val[nmax],d=0,w[nmax];
int n;
void insert(int x)
{
int y;
dim++;
heap[dim]=x;y=dim;
w[x]=dim;
while(y/2&&val[heap[y]]<val[heap[y/2]])
{
heap[y]^=heap[y/2]^=heap[y]^=heap[y/2];
w[heap[y]]^=w[heap[y/2]]^=w[heap[y]]^=w[heap[y/2]];
y=y/2;
}
}
void rec(int x)
{
int nm=x,st=2*x,dr=st+1,vm=val[heap[x]];
if(st<=dim&&val[heap[st]]<vm)
{
vm=val[heap[st]];
nm=st;
}
if(dr<=dim&&val[heap[dr]]<vm)
{
vm=val[heap[dr]];
nm=dr;
}
if(nm!=x)
{
heap[nm]^=heap[x]^=heap[nm]^=heap[x];
w[heap[nm]]^=w[heap[x]]^=w[heap[nm]]^=w[heap[x]];
rec(nm);
}
}
void del(int x)
{
int nx=w[x];
w[heap[dim]]=nx;
heap[nx]^=heap[dim]^=heap[nx]^=heap[dim];
dim--;
rec(nx);
}
int main()
{
int i,op,x;
fscanf(fin,"%d",&n);
for(i=1;i<=n;i++)
{
fscanf(fin,"%d",&op);
if(op==1)
{
d++;
fscanf(fin,"%d",&val[d]);
insert(d);
}
if(op==2)
{
fscanf(fin,"%d",&x);
del(x);
}
if(op==3) fprintf(fout,"%d\n",val[heap[1]]);
}
fclose(fin);
fclose(fout);
return 0;
}