Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- using namespace std;
- ifstream in("heapuri.in");
- ofstream out("heapuri.out");
- long long n,x,operatie,p=1;
- long long heap[200005],pozitie[200005],ordine[400005];
- void sift(long long heap[],long long &inaltime,long long k)
- {
- long long fiu,aux;
- do{
- fiu=0;
- if(2*k <= inaltime)
- {
- fiu=2*k;
- if(2*k+1 <= inaltime && heap[2*k+1]<heap[2*k]) fiu=2*k+1;
- if(heap[fiu] >= heap[k]) fiu=0;
- }
- if(fiu){
- pozitie[heap[fiu]]=k;
- pozitie[heap[k]]=fiu;
- aux=heap[k];
- heap[k]=heap[fiu];
- heap[fiu]=aux;
- }
- }while(fiu);
- return;
- }
- void fa_heap(long long heap[],long long &inaltime,long long k)
- {
- long long cheie=heap[k];
- while((k>1) && (cheie<heap[k/2]))
- {
- heap[k]=heap[k/2];
- pozitie[heap[k/2]]=k;
- k=k/2;
- }
- pozitie[cheie]=k;
- heap[k]=cheie;
- return;
- }
- void inserare_heap(long long heap[],long long &inaltime,long long x)
- {
- inaltime++;
- heap[inaltime]=x;
- ordine[p]=x;
- p++;
- pozitie[x]=inaltime;
- fa_heap(heap,inaltime,inaltime);
- return;
- }
- void stergere_heap(long long heap[],long long &inaltime,long long poz)
- {
- heap[poz]=heap[inaltime];
- inaltime--;
- if(poz>1 && heap[poz]<heap[poz/2]) fa_heap(heap,inaltime,poz);
- else sift(heap,inaltime,poz);
- return;
- }
- int main()
- {
- long long i,inaltime;
- in>>n;
- inaltime=0;
- for(i=1;i<=n;i++)
- {
- in>>operatie;
- if(operatie==1)
- {
- in>>x;
- inserare_heap(heap,inaltime,x);
- }
- if(operatie==2)
- {
- in>>x;
- if(inaltime>0) stergere_heap(heap,inaltime,pozitie[ordine[x]]);
- }
- if(operatie==3)
- {
- out<<heap[1]<<"\n";
- }
- }
- in.close();
- out.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement