Cod sursa(job #1735898)
| Utilizator | Data | 31 iulie 2016 15:56:44 | |
|---|---|---|---|
| Problema | Heapuri | Scor | 20 |
| Compilator | cpp | Status | done |
| Runda | Arhiva educationala | Marime | 1.76 kb |
using namespace std;
#include<fstream>
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n;
int H[200001],nr; //heap
int ord[200001],l; // ord[i] - pozitia in heap a elementului intrat al i-lea in multime (de ordin i sa spunem)
int pos[200001]; // pos[i] - pozitia din ord[] la care gasim elementul i din heap
int main()
{
int i,j,o,x,aux;
f>>n;
while(n--)
{
f>>o;
if(o==1)
{
f>>x;
H[++nr]=x;
ord[++l]=l;
pos[nr]=l;
i=nr;
while(i>1)
{
if(H[i]<H[i/2])
{
aux=H[i];
H[i]=H[i/2];
H[i/2]=aux;
aux=ord[pos[i]];
ord[pos[i]]=ord[pos[i/2]];
ord[pos[i/2]]=aux;
aux=pos[i];
pos[i]=pos[i/2];
pos[i/2]=aux;
i=i/2;
}
else i=1;
}
}
else if(o==2)
{
f>>x;
H[ord[x]]=H[nr];
pos[ord[x]]=pos[nr];
nr--;
i=ord[x];
while(i*2<=nr)
{
j=2*i;
if(j+1<=nr && H[j+1]<H[j]) j++;
if(H[i]>H[j])
{
aux=H[i];
H[i]=H[j];
H[j]=aux;
aux=ord[pos[i]];
ord[pos[i]]=ord[pos[j]];
ord[pos[j]]=aux;
i=j;
}
else i=nr/2+2;
}
}
else g<<H[1]<<'\n';
}
return 0;
}
