Pagini recente » Cod sursa (job #1344168) | Voteaza Algorel | Cod sursa (job #2815037) | Cod sursa (job #1342085) | Cod sursa (job #1623798)
#include<cstdio>
#include<algorithm>
using namespace std;
int h[200001], ord[200001], poz[200001], l, cnt, n;
void up(int i)
{
while(i>1 && h[i]<h[i/2])
{
swap(h[i], h[i/2]);
swap(ord[i], ord[i/2]);
poz[ord[i/2]]=i/2;
poz[ord[i]]=i;
i=i/2;
}
}
void down(int i)
{
int ind;
if(i==1)
if(h[2*i])
if(h[2*i]<h[i])
{
swap(h[i],h[i*2]);
swap(poz[ord[i]], poz[ord[i*2]]);
swap(ord[i], ord[i*2]);
}
while(i<l-1 && h[i]>min(h[i*2], h[i*2+1]))
{
if(h[i*2]<h[i*2+1])
swap(h[i],h[i*2]);
else
swap(h[i],h[i*2+1]);
if(h[i*2]<=h[i*2+1])
ind=i*2;
else
ind=i*2+1;
swap(ord[i], ord[ind]);
poz[ord[ind]]=ind;
poz[ord[i]]=i;
i=ind;
}
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int x, i, op, in, ind;
scanf("%d", &n);
for(i=1; i<=n; i++)
{
scanf("%d", &op);
// for(in=1; in<=l; in++)
// printf("%d ", h[in]);
// printf("\n");
if(op!=3)
{
scanf("%d", &x);
if(op==1) //adauga
{
l++;
cnt++;
h[l]=x;
ord[l]=cnt;
poz[cnt]=l;
up(l);
}
else //sterge
{
if(poz[x]==l)
{
poz[x]=-1;
ord[l]=0;
h[l]=0;
l--;
}
else
{
h[poz[x]]=h[l];
swap(ord[poz[x]], ord[l]);
poz[ord[poz[x]]]=poz[x];
ind=poz[x];
poz[x]=-1;
ord[l]=0;
h[l]=0;
l--;
up(ind);
down(ind);
}
}
}
else
{
printf("%d\n", h[1]);
}
}
return 0;
}