Pagini recente » Monitorul de evaluare | Cod sursa (job #1765403) | Cod sursa (job #1020198) | Cod sursa (job #997939) | Cod sursa (job #2298225)
#include <cstdio>
#include <utility>
#define val first
#define pos second
using namespace std;
int nr,n;
pair <int,int> chronological[200001],heap[200001];
int push(int x)
{
int p=++n;
heap[p]={x,nr};
while(p>1 && heap[p].val<heap[p/2].val)
{
chronological[heap[p/2].pos].pos=p;
chronological[heap[p].pos].pos=p/2;
pair<int,int> aux=heap[p];
heap[p]=heap[p/2];
heap[p/2]=aux;
p/=2;
}
if(!(p%2))
if(heap[p].val>heap[p+1].val && p+1<=n)
{
chronological[heap[p+1].pos].pos=p;
chronological[heap[p].pos].pos=p+1;
pair<int,int> aux=heap[p];
heap[p]=heap[p+1];
heap[p+1]=aux;
p++;
}
else ;
else
if(heap[p].val<heap[p-1].val)
{
chronological[heap[p-1].pos].pos=p;
chronological[heap[p].pos].pos=p-1;
pair<int,int> aux=heap[p];
heap[p]=heap[p-1];
heap[p-1]=aux;
p--;
}
return p;
}
void pull(int p)
{
chronological[heap[n].pos].pos=p;
chronological[heap[p].pos].pos=n;
pair<int,int> aux=heap[p];
heap[p]=heap[n];
heap[n]=aux;
n--;
while(p*2<=n && heap[p].val>heap[p*2].val)
{
if(p*2+1<=n && heap[p*2].val>heap[p*2+1].val)
{
chronological[heap[p*2+1].pos].pos=p*2;
chronological[heap[p*2].pos].pos=p*2+1;
pair<int,int> aux=heap[p*2];
heap[p*2]=heap[p*2+1];
heap[p*2+1]=aux;
}
chronological[heap[p*2].pos].pos=p;
chronological[heap[p].pos].pos=p*2;
pair<int,int> aux=heap[p];
heap[p]=heap[p*2];
heap[p*2]=aux;
if(p*2+1<=n && heap[p*2].val>heap[p*2+1].val)
{
chronological[heap[p*2+1].pos].pos=p*2;
chronological[heap[p*2].pos].pos=p*2+1;
pair<int,int> aux=heap[p*2];
heap[p*2]=heap[p*2+1];
heap[p*2+1]=aux;
p=p*2+1;
continue ;
}
p=p*2;
}
}
int main()
{
int q,x,p,c;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&q);
while(q--)
{
scanf("%d",&c);
if(c==1)
{
scanf("%d",&x);
nr++;
p=push(x);
chronological[nr]={x,p};
continue ;
}
if(c==2)
{
scanf("%d",&x);
pull(chronological[x].pos);
continue ;
}
printf("%d\n",heap[1].first);
}
return 0;
}