Cod sursa(job #2483584)

Utilizator E1goBack Andrei-Gheorghe E1go Data 29 octombrie 2019 22:07:22
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

const int Maxx = 2e5+5;
int v[Maxx], poz[Maxx], pozh[Maxx], k;

void Up(int nr)
{
    int fiu=k;
    int tata=fiu/2;
    while(tata && nr < v[tata])
    {
        pozh[v[tata]]=fiu;
        v[fiu]=v[tata];
        fiu=tata;
        tata=fiu/2;
    }
    v[fiu]=nr;
    pozh[v[fiu]]=fiu;
}

void Down(int n)
{
    int i=n;
    while(2*i <= k && v[i]>min(v[2*i], v[2*i+1]))
    {
        if(2*i+1 > k)
        {
            if(v[i] > v[2*i])
                {
                    swap(v[i], v[2*i]);
                    swap( pozh[v[i]] , pozh[v[2*i]] );
                }
            i*=2;
        }
        else
        {
            if(v[2*i] < v[2*i+1])
            {
                if(v[2*i] < v[i])
                   {
                      swap(v[2*i], v[i]);
                      swap( pozh[v[i]] , pozh[v[2*i]] );
                   }
                i*=2;
            }
            else
            {
                if(v[2*i+1] < v[i])
                   {
                     swap(v[2*i+1], v[i]);
                     swap( pozh[v[i]] , pozh[v[2*i+1]] );
                   }
                i*=2;
                i++;
            }
        }
    }
}

int main()
{
    int x, nr, n;
    fin>>n;
    while(n)
    {
        fin>>x;
        if(x==1)
        {
            fin>>nr;
            k++;
            poz[k]=nr;
            pozh[nr]=k;
            Up(nr);
        }
        else
         if(x==2)
        {
          fin>>nr;
          v[pozh[poz[nr]]]=v[k--];
          Down(pozh[poz[nr]]);
        }
        else
        {
            fout<<v[1]<<"\n";
        }
        n--;
    }
    return 0;
}