Pagini recente » Cod sursa (job #1295989) | ONIS 2015, Runda 2 | Cod sursa (job #283089) | Cod sursa (job #3273721) | Cod sursa (job #235763)
Cod sursa(job #235763)
#include <cstdio>
#include <string>
#define N 200001
#define L ((i)<<1)
#define R (L+1)
#define T ((i)>>1)
int H[N], poz[N],pos[N];
int nh;
inline void swap(int i, int j)
{
int t=H[i];
H[i]=H[j];
H[j]=t;
t=poz[i];
poz[i]=poz[j];
poz[j]=t;
pos[poz[i]]=i;
pos[poz[j]]=j;
}
inline void upheap(int i)
{
if(i<=1) return;
if(H[i] < H[T]) swap(i, T), upheap(T);
}
inline void downheap(int i)
{
int m=i;
if(L<=nh) if(H[L] < H[m]) m=L;
if(R<=nh) if(H[R] < H[m]) m=R;
if(m!=i) swap(i, m), downheap(m);
}
#define dim 8192
char ax[dim];
int pz;
inline void cit(int &x)
{
x=0;
while(ax[pz]<'0' || ax[pz]>'9')
if(++pz==dim)fread(ax,1,dim,stdin),pz=0;
while(ax[pz]>='0' && ax[pz]<='9')
{
x=x*10+ax[pz]-'0';
if(++pz==dim)fread(ax,1,dim,stdin),pz=0;
}
}
int main()
{
freopen("heapuri.in","r",stdin);
int n,i,p,q;
int nr_insert=0;
cit(n);
while(n--)
{
cit(p);
if(p!=3) cit(q);
/*
for(i=1;i<=nh;++i) printf("%d ", H[i]);
printf("\n");
for(i=1;i<=nh;++i) printf("%d ", poz[i]);
printf("\n");
for(i=1;i<=nr_insert;++i)printf("%d ", pos[i]);
*/
//printf("%d %d++ %d %d\n", p,q,pos[q],nh);
if(p == 1)
{
H[++nh]=q;
poz[nh]=++nr_insert;
pos[poz[nh]]=nh;
upheap(nh);
}
if(p == 2)
{
// swap(pos[q], 1);
int px=pos[q];
swap(px, nh--);
downheap(px);
}
if(p == 3)
{
printf("%d\n", H[1]);
}
}
return 0;
}