Cod sursa(job #2296897)

Utilizator stan_flaviusStan Flavius Stefan stan_flavius Data 5 decembrie 2018 06:30:50
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#define nmax 200001
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int v[nmax],H[nmax],poz[nmax];
int n,q,x;

void Insert(int x)
{ while(x/2!=0 && v[H[x/2]]>v[H[x]])
         { swap(H[x/2],H[x]);
           poz[H[x]]=x;
           poz[H[x/2]]=x/2;
           x/=2;
         }
}

void Delete(int x,int len)
{ int y=0;
  while(x!=y)
	{ y=x;
      if(2*y<=len && v[H[x]]>v[H[2*y]])
          x=2*y;
      if(2*y+1<=len && v[H[x]]>v[H[2*y+1]])
          x=2*y+1;
      swap(H[x],H[y]);
      poz[H[x]]=x;
      poz[H[y]]=y;
	}
}

int main()
{
    int i,len=0,nr=0;
    fin>>n;
    for(i=1;i<=n;i++)
       {fin>>q;
        if(q==1)
           {fin>>x;
            v[++nr]=x;
            H[++len]=nr;
            poz[nr]=len;
            Insert(poz[nr]);
           }
        if(q==2)
            { fin>>x;
              v[x]=-1;
              Insert(poz[x]);
              poz[H[1]]=0;
              H[1]=H[len--];
              poz[H[1]] = 1;
              if(len>1) Delete(1,len);
            }
        if(q==3) fout<<v[H[1]]<<"\n";
        }



    return 0;
}