Pagini recente » Monitorul de evaluare | Cod sursa (job #1877278) | Cod sursa (job #1881450) | Cod sursa (job #1910818) | Cod sursa (job #1416963)
#include <stdio.h>
#define left(x) x * 2
#define right(x) x * 2 + 1
using namespace std;
int n, nr, poz[200100], v[200100], h[200100];
FILE*f=fopen("heapuri.in","r"),*g=fopen("heapuri.out","w");
void interschimbare (int a, int b)
{
int aux = v[a];
v[a] = v[b];
v[b] = aux;
aux = h[a];
h[a] = h[b];
h[b] = aux;
}
void up(int a)
{
while(a >= 1)
{
if(v[a/2] > v[a])
{
poz[h[a/2]] = a;
poz[h[a]] = a/2;
interschimbare(a/2,a);
}
if(v[a] < v[a/2 +1])
{
poz[h[a]] = a/2+1;
poz[h[a/2+1]] = a;
interschimbare(a/2+1,a);
}
a /= 2;
}
}
void down(int a)
{
int s = 1, f = a;
while(left(a) <= nr )
{
f = left(a);
if(right(s) <= nr && v[right(a)] < v[left(a)])
f = right(a);
if(v[f] < v[a])
{
poz[h[f]] = a;
poz[h[a]] = f;
interschimbare(f,a);
}
a = f;
}
if(v[f] > v[f + 1] && f+1 == nr)
{
poz[h[f]] = f+1;
poz[h[f+1]] = f;
interschimbare(f,f+1);
}
else if(f == nr && v[f] < v[f-1])
{
poz[h[f]] = f-1;
poz[h[f-1]] = f;
interschimbare(f,f-1);
}
}
int main()
{
int o, y;
fscanf(f,"%d ",&n);
int in = 0;
for(int i = 1; i <= n; i++)
{
fscanf(f,"%d",&o);
if(o == 1)
{
fscanf(f,"%d ",&y);
in++;
nr++;
v[nr] = y;
poz[in]= nr;
h[nr]=in;
up(nr);
}
if(o == 2)
{
fscanf(f,"%d ",&y);
int d = poz[y];
interschimbare(poz[y], nr);
nr--;
if(d > 1 && v[d/2] > v[d])
{
up(d);
}
else
{
down(d);
}
}
if(o == 3)
fprintf(g,"%d\n", v[1]);
}
return 0;
}