Pagini recente » Cod sursa (job #357596) | Cod sursa (job #266723) | Cod sursa (job #2845500) | Rezultatele filtrării | Cod sursa (job #581419)
Cod sursa(job #581419)
#include<fstream.h>
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n,v[200005],heap[200005],t,x,o,c,cand[200005];
void schimba(int a, int b)
{ int c=heap[a];
heap[a]=heap[b];
heap[b]=c;
c=v[cand[a]];
v[cand[a]]=v[cand[b]];
v[cand[b]]=c;
c=cand[a];
cand[a]=cand[b];
cand[b]=c;
}
void sift(int);
void percolate(int);
void insert(int);
void elim(int);
int main()
{
for(f>>o;o;--o)
{ f>>t;
if(t==3) g<<heap[1]<<'\n';
else if(t==1)
{ f>>x;
insert(x);
}
else { f>>x;
elim(v[x]);
}
//for(int i=1;i<=n;++i) g<<heap[i]<<' '<<v[i]<<' '<<cand[i]<<'\n';
//g<<'\n';
}
f.close(); g.close();
return 0;
}
void sift(int k)
{
int son;
do{ son=0;
if(k+k<=n)
{ son=k+k;
if(son<n && heap[son+1]<heap[son]) ++son;
if(heap[son]>=heap[k]) son=0;
}
if(son) { schimba(k,son); k=son;}
} while(son);
}
void percolate(int k)
{
int key=heap[k];
while(k>1 && key<heap[k/2])
{ schimba(k,k/2);
k/=2;
}
}
void insert(int x)
{
heap[++n]=x;
v[++c]=n;
cand[n]=c;
percolate(n);
}
void elim(int k)
{ schimba(k,n);
--n;
if(heap[k]<heap[k/2]) percolate(k);
else sift(k);
}