Mai intai trebuie sa te autentifici.
Cod sursa(job #1533147)
Utilizator | Data | 22 noiembrie 2015 10:15:24 | |
---|---|---|---|
Problema | Heapuri | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.69 kb |
#include <iostream>
#include <cstdio>
using namespace std;
int n,v[200002],inuri;
pair <int ,int >heap[200002];
void adaugare(int x)
{
heap[++n].first=x;
v[++inuri]=n;
heap[n].second=inuri;
int n1=n;
while (n1>1)
{
if (heap[n1].first > heap[n1/2].first)
break;
swap(v[heap[n1].second],v[heap[n1/2].second]);
swap(heap[n1],heap[n1/2]);
n1/=2;
}
}
void sterg(int poz)
{
swap(v[heap[poz].second],v[heap[n].second]);
heap[poz]=heap[n--];
if (heap[poz] < heap[poz/2])
while (poz>1 && heap[poz/2] > heap[poz])
{
swap(v[heap[poz].second],v[heap[poz/2].second]);
swap(heap[poz/2],heap[poz]);
poz/=2;
}
else
while (1)
{
int fpoz=2*poz;
if (fpoz>n)
break;
if ( fpoz+1 <=n && heap[fpoz] > heap[fpoz+1])
fpoz++;
if (heap[fpoz] >= heap[poz])
break;
swap(v[heap[fpoz].second],v[heap[poz].second]);
swap(heap[fpoz],heap[poz]);
poz=fpoz;
}
}
void solve ()
{
int nr;
scanf("%d",&nr);
int op,a;
for (int i=1; i<=nr; ++i)
{
scanf("%d",&op);
if (op==1)
{
scanf("%d",&a);
adaugare(a);
}
else
{
if (op==2)
{
scanf("%d",&a);
sterg(v[a]);
}
else
printf("%d\n",heap[1]);
}
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
solve();
return 0;
}