Cod sursa(job #2755897)

Utilizator un_fes_galbendaniel guba un_fes_galben Data 28 mai 2021 18:24:20
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.75 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
char buff[4096];
int pbuf=4095;
void readbuff()
{
    pbuf=0;
    fin.read(buff,4095);
}
int citire()
{
    int nr=0;
    if(pbuf==4095)
    {
        readbuff();
    }
    while(buff[pbuf]<'0'||buff[pbuf]>'9')
    {
        pbuf++;
        if(pbuf==4095)
        {
            readbuff();
        }
    }
    while(buff[pbuf]>='0'&&buff[pbuf]<='9')
    {
        nr=nr*10+buff[pbuf]-'0';
        pbuf++;
        if(pbuf==4095)
        {
            readbuff();
        }
    }
    return nr;
}
struct numar
{
    int val,intrare;
}v[200005];
int p[200005];
int main()
{
    int n,x,op,poz=0,poz1,poz2,cnt=0;
    n=citire();
    for(int i=1;i<=n;i++)
    {
        op=citire();
        if(op==1)
        {
            cnt++;
            poz++;
            x=citire();
            v[poz].val=x;
            v[poz].intrare=cnt;
            p[cnt]=poz;
            poz1=poz;
            while(poz1>=2)
            {
                if(v[poz1].val<v[poz1/2].val)
                {
                    swap(p[v[poz1].intrare],p[v[poz1/2].intrare]);
                    swap(v[poz1],v[poz1/2]);
                }
                else
                {
                    break;
                }
                poz1/=2;
            }
        }
        else if(op==2)
        {
            x=citire();
            poz2=p[x];
            poz1=poz2;
            swap(p[v[poz1].intrare],p[v[poz].intrare]);
            swap(v[poz1],v[poz]);
            v[poz].val=0;
            v[poz].intrare=0;
            poz--;
            if(poz2!=poz+1)
            {
                poz1=poz2;
                while(2*poz1<=poz)
                {
                    if(2*poz1+1<=poz)
                    {
                        if(v[poz1].val>min(v[2*poz1+1].val,v[2*poz1].val))
                        {
                            if(v[2*poz1+1].val>v[2*poz1].val)
                            {
                                swap(p[v[poz1].intrare],p[v[2*poz1].intrare]);
                                swap(v[poz1],v[2*poz1]);
                                poz1=2*poz1;
                            }
                            else
                            {
                                swap(p[v[poz1].intrare],p[v[2*poz1+1].intrare]);
                                swap(v[poz1],v[2*poz1+1]);
                                poz1=2*poz1+1;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        if(v[poz1].val>v[2*poz1].val)
                        {
                           swap(p[v[poz1].intrare],p[v[2*poz1].intrare]);
                           swap(v[poz1],v[2*poz1]);
                           poz1=poz1*2;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                poz1=poz2;
                 while(poz1>=2)
                {
                    if(v[poz1].val<v[poz1/2].val)
                    {
                        swap(p[v[poz1].intrare],p[v[poz1/2].intrare]);
                        swap(v[poz1],v[poz1/2]);
                    }
                    else
                    {
                        break;
                    }
                    poz1/=2;
                }
            }
        }
        else if(op==3)
        {
            fout<<v[1].val<<'\n';
        }
    }
    return 0;
}