Mai intai trebuie sa te autentifici.
Cod sursa(job #431192)
Utilizator | Data | 31 martie 2010 19:14:01 | |
---|---|---|---|
Problema | Heapuri | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.57 kb |
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 200005;
int N, L = 0, NR = 0;
int A[NMAX];// A[i] retine valoarea elementului i
int Heap[NMAX];//Heap[i] retine elementul de pe pozitia i
int Poz[NMAX];//Poz[i] retine pozitia in heap a elementului i
void write(int nr)
{
for(int i = 1 ; i <= nr ; i++)
printf("%d ",A[i]);
printf("\n");
for(int i = 1 ; i <= nr ; i++)
printf("%d ",Heap[i]);
printf("\n");
for(int i = 1 ; i <= nr ; i++)
printf("%d ",Poz[i]);
printf("\n\n");
}
void adauga(int x)
{
for(int i = x; i ; i = i/2)
if(i/2 && A[Heap[i]] < A[Heap[i/2]])
{
swap(Heap[i], Heap[i/2]);
Poz[Heap[i]] = i;
Poz[Heap[i/2]] = i/2;
}
}
void aranjeaza(int x)
{
int y = 0;
while(x != y)
{
y = x;
if(2 * y <= L && A[Heap[x]] > A[Heap[2 * y]])
x = 2 * y;
if(2 * y + 1 <= L && A[Heap[x]] > A[Heap[2 * y + 1]])
x = 2 * y + 1;
swap(Heap[x], Heap[y]);
Poz[Heap[x]] = x;
Poz[Heap[y]] = y;
}
}
void rezolva()
{
int iden, x;
scanf("%d",&N);
for(int i = 1 ; i <= N ; i++)
{
scanf("%d",&iden);
if(iden != 3)
scanf("%d",&x);
if(iden == 1)
{
A[++NR] = x;
Heap[++L] = NR;
Poz[NR] = L;
adauga(L);
}
if(iden == 2)
{
A[x] = -1;
adauga(Poz[x]);
Poz[Heap[1]] = 0;
Heap[1] = Heap[L--];
Poz[Heap[1]] = 1;
if(L > 1)
aranjeaza(1);
}
if(iden == 3)
printf("%d\n",A[Heap[1]]);
//write(i);
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
rezolva();
return 0;
}