Pagini recente » Cod sursa (job #1158016) | Cod sursa (job #3145628) | Cod sursa (job #682039) | Cod sursa (job #1522227) | Cod sursa (job #2085088)
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int MAX_HEAP_SIZE=200001;
typedef int Heap[MAX_HEAP_SIZE];
Heap H;
int N,i,cod,poz,x,n,v[200001];
int tata(int nod){return nod/2;}
int fiu_s(int nod){return nod*2;}
int fiu_d(int nod){return nod*2+1;}
void sift(Heap H,int n,int k){/// COBOARA
int fiu;
do{
fiu=0;
/// ALEGE UN FIU < TATAL
if(fiu_s(k)<=n)
{
fiu=fiu_s(k);
if(fiu_d(k)<=n&&H[fiu_d(k)]<H[fiu_s(k)])
fiu=fiu_d(k);
if(H[fiu]>=H[k])
fiu=0;
}
if(fiu)
{
swap(H[k],H[fiu]);
k=fiu;
}
}while(fiu);
}
void percolate(Heap H,int n,int k) {/// URCA
int key=H[k];
while((k>1)&&(key<H[tata(k)]))
{
H[k]=H[tata(k)];
k=tata(k);
}
H[k]=key;
}
void cut(Heap H,int&n,int k) { ///TAIE EL. DE PE POZ K
H[k]=H[n];
--n;
if((k>1)&&(H[k]<H[tata(k)]))
percolate(H,n,k);
else
sift(H,n,k);
}
void insert(Heap H,int&n,int key){
H[++n]=key;
percolate(H,n,n);
}
int pozitia_stergere(int x,int n,Heap H){//al x-lea el intrat in multime
int i;
for(i=1 ; i<=n ; ++i)
if(H[i]==x)break;
return i;
}
int main()
{
f>>N;
for(i=1 ; i<=N ; ++i)
{
f>>cod;
if(cod==3)
g<<H[1]<<'\n';
else
{
f>>x;
if(cod==1)
{
insert(H,n,x);
v[n]=x;
}
else
{
poz=pozitia_stergere(v[x],n,H);
cut(H,n,poz);
}
}
}
return 0;
}