Pagini recente » Cod sursa (job #1307699) | Cod sursa (job #390414) | Cod sursa (job #2252646) | Cod sursa (job #2831047) | Cod sursa (job #1226631)
#include<cstdio>
#include<algorithm>
using namespace std;
int n,i,j,p,q,nr,m,poz;
struct nod
{
int x;
int y;
} v[200005];
int w[200005];
int father(int X)
{
return X/2;
}
int left_son(int X)
{
return X*2;
}
int right_son(int X)
{
return X*2+1;
}
void shift(int N,int K)
{
int son=0;
do
{
son=0;
if (left_son(K)<=N)
{
son=left_son(K);
if ((v[son].x>v[right_son(K)].x)&&(right_son(K)<=N)) son=right_son(K);
if (v[son].x>=v[K].x) son=0;
if (son) swap(w[v[son].y],w[v[K].y]),swap(v[son],v[K]),K=son;
}
} while (son);
}
void percolate(int N,int &K)
{
int k=v[K].x,l1=v[K].y;
while ((K>1)&&(k<v[father(K)].x))
{
w[v[K].y]=father(K);
w[v[father(K)].y]=K;
swap(v[K],v[father(K)]);
K=father(K);
}
v[K].x=k; v[K].y=l1;
w[v[K].y]=l1;
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&m);
while (m--)
{
scanf("%d",&p);
if (p==1)
{
q++;
scanf("%d",&nr);
if (n==0) {v[++n].x=nr; v[n].y=q; w[q]=n;}
else
{
v[++n].x=nr; poz=n; v[n].y=q;
percolate(n,poz);
w[q]=poz;
}
}
if (p==2)
{
scanf("%d",&nr);
v[w[nr]].x=10000000000;
shift(n,w[nr]);
n--;
}
if (p==3) printf("%d\n",v[1]);
}
return 0;
}