Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1070145) | Monitorul de evaluare | Cod sursa (job #1846564)
#include <fstream>
#define VAL 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int N, M, i, j;
int op, x, a, b;
int v[VAL];
int nr[VAL];
int poz[VAL];
int heap[VAL];
void percolate(int p, int x)
{
while (heap[p]<heap[p / 2] && p!=1)
{
swap(heap[p], heap[p / 2]);
swap(poz[p], poz[p / 2]);
nr[poz[p]]=p;
nr[poz[p / 2]]=p / 2;
p/=2;
}
}
void sift(int p)
{
while (p<N)
{
a=2*p;
b=2*p+1;
if (a<=N && b<=N)
{
if (heap[a]<=heap[b] && heap[p]>heap[a])
{
swap(heap[p], heap[a]);
swap(poz[p], poz[a]);
nr[poz[p]]=p;
nr[poz[a]]=a;
p=a;
}
if (heap[b]<=heap[a] && heap[p]>heap[b])
{
swap(heap[p], heap[b]);
swap(poz[p], poz[b]);
nr[poz[p]]=p;
nr[poz[b]]=b;
p=b;
}
}
else
{
if (a<=N && heap[p]>heap[a])
{
swap(heap[p], heap[a]);
swap(poz[p], poz[a]);
nr[poz[p]]=p;
nr[poz[a]]=a;
p=a;
}
if (a>N)
break;
}
}
}
int main()
{
fin >> M;
for (i=1; i<=M; i++)
{
fin >> op;
if (op==3)
{
fout << heap[1] << '\n';
for (j=1; j<=N; j++)
fout << heap[j] << " " << poz[j] << '\n';
fout << '\n';
}
else
fin >> x;
if (op==1)
{
v[++N]=x;
poz[N]=N;
heap[N]=x;
percolate(N, x);
}
if (op==2)
{
swap(heap[poz[x]], heap[N]);
swap(poz[x], poz[N]);
nr[poz[x]]=x;
nr[poz[N]]=N;
N--;
sift(nr[poz[x]]);
}
}
fin.close();
fout.close();
return 0;
}