Pagini recente » Istoria paginii runda/verificareoni | Cod sursa (job #2209615) | Cod sursa (job #339176) | Cod sursa (job #2218678) | Cod sursa (job #1847302)
#include <fstream>
#define VAL 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct Heaps
{
int val, pos;
};
Heaps heap[VAL];
int N, M, i, j;
int op, x, a, b;
int v[VAL], K;
int poz[VAL];
void change(int x, int y)
{
swap(heap[x], heap[y]);
poz[heap[x].pos]=x;
poz[heap[y].pos]=y;
}
void percolate(int p)
{
while (heap[p].val<heap[p / 2].val && p!=1)
{
change(p, 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].val<=heap[b].val && heap[p].val>heap[a].val)
{
change(p, a);
p=a;
}
if (heap[b].val<=heap[a].val && heap[p].val>heap[b].val)
{
change(p, b);
p=b;
}
}
else
{
if (a<=N && heap[p].val>heap[a].val)
{
change(p, a);
p=a;
}
else
if (a>N)
break;
}
}
}
int main()
{
fin >> M;
for (i=1; i<=M; i++)
{
fin >> op;
if (op==3)
{
fout << heap[1].val << '\n';
/*for (j=1; j<=K; j++)
fout << heap[j].val << " " << heap[j].pos << " " << poz[heap[j].pos] << '\n';*/
// fout << '\n';
}
else
fin >> x;
if (op==1)
{
v[++N]=x;
poz[N]=N;
heap[N].val=x;
heap[N].pos=N;
K++;
poz[N]=N;
percolate(N);
}
if (op==2)
{
a=poz[x];
//fout << a << '\n';
change(K, poz[x]);
K--;
/*for (j=1; j<=K; j++)
fout << heap[j].val << " " << heap[j].pos << " " << poz[heap[j].pos] << '\n';
fout << '\n';*/
sift(a);
}
}
fin.close();
fout.close();
return 0;
}