Pagini recente » Cod sursa (job #2059915) | Cod sursa (job #1320344) | Cod sursa (job #2296856) | Cod sursa (job #561187) | Cod sursa (job #1427247)
#include <iostream>
#include <deque>
#include <vector>
#include <cstring>
#include <bitset>
#include <algorithm>
#include <queue>
#define INF 1<<30
#define uint unsigned int
#define ll long long
using namespace std;
int T, type, i, H[200010], val[200010], pos[200010], cnt, N, x;
void heapUp(int poz)
{
while(poz > 1)
{
if(val[H[poz]] < val[H[poz>>1]])
{
pos[H[poz]] = poz>>1;
pos[H[poz>>1]] = poz;
swap(H[poz],H[poz>>1]);
poz = poz >> 1;
}
else
break;
}
}
void heapDown(int poz)
{
while(poz + poz <= N)
{
if(poz + poz + 1 > N)
{
if(val[H[poz]] > val[H[poz + poz]])
{
pos[H[poz]] = poz + poz;
pos[H[poz + poz]] = poz;
swap(H[poz], H[poz + poz]);
poz = poz + poz;
continue;
}
else
break;
}
int y = poz + poz;
if(val[H[y]] > val[H[y+1]])
y = y + 1;
if(val[H[poz]] > val[H[y]])
{
pos[H[poz]] = y;
pos[H[y]] = poz;
swap(H[poz], H[y]);
poz = y;
continue;
}
else
break;
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&T);
while(T--)
{
scanf("%d",&type);
if(type == 1)
{
scanf("%d",&x);
val[++cnt] = x;
H[++N] = cnt;
pos[cnt] = N;
heapUp(N);
}
if(type == 2)
{
scanf("%d",&x);
pos[H[N]] = pos[x];
swap(H[N], H[pos[x]]);
N = N - 1;
heapUp(pos[x]);
heapDown(pos[x]);
}
if(type == 3)
{
printf("%d\n",val[H[1]]);
}
}
return 0;
}