Cod sursa(job #1450205)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 11 iunie 2015 20:52:20
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.88 kb
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>

#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)

using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int M,N,nrord;
int v[200005],ord[200005];

inline int firstson(int);
inline int secondson(int);
inline int dad(int);
inline void percolate(int);
inline void sift(int);
inline void inser(int);

int main()
{
    N=0;
    f>>M;
    while (M--)
    {
        int tip;
        f>>tip;
        if (tip==1) {
            int x;
            f>>x;
            inser(x);
        }
        else if (tip==2) {
            int x,poz;
            f>>x;
            FOR (i,1,N)
                if (ord[i]==x) {
                    poz=i;
                    break;
                }
            /*FOR (i,1,N)
                cout<<ord[i]<<' ';
            cout<<'\n';
            FOR (i,1,N)
                cout<<v[i]<<' ';
            cout<<"\n\n";*/
            x=poz;
            swap(ord[x],ord[N]);
            swap(v[x],v[N]);
            N--;
            if (v[x]<v[dad(x)] && x!=1)
                percolate(x);
            else
            {
                sift(x);
            }
            /*FOR (i,1,N)
                cout<<ord[i]<<' ';
            cout<<'\n';
            FOR (i,1,N)
                cout<<v[i]<<' ';
            cout<<"\n\n\n";*/
        }
        else {
            g<<v[1]<<'\n';
        }
    }
    /*FOR (i,1,N)
        cout<<ord[i]<<' ';
    cout<<'\n';
    FOR (i,1,N)
        cout<<v[i]<<' ';
    cout<<'\n';*/
    f.close();g.close();
    return 0;
}


inline int firstson(int n)
{
    return 2*n;
}

inline int secondson(int n)
{
    return 2*n+1;
}

inline int dad(int n)
{
    return n/2;
}

inline void percolate(int n)
{
    int val=v[n];
    while (n>1 && val<v[dad(n)])
    {
        //cout<<n<<">1 "<<val<<'<'<<v[dad(n)]<<' '<<n<<'\n';
        swap(ord[dad(n)],ord[n]);
        v[n]=v[dad(n)];
        n=dad(n);
        //cout<<n<<">1 "<<val<<'<'<<v[dad(n)]<<' '<<n<<'\n';
    }
    v[n]=val;
    //cout<<'\n';
}

inline void sift(int n)
{
    int son;
    do {
        son=0;
        if (firstson(n)<=N)
        {
            son=firstson(n);
            if (secondson(n)<=N && v[secondson(n)]<v[firstson(n)])
                son=secondson(n);
            //cout<<son<<' ';
            if (v[son]>=v[n])
                son=0;
        }
        if (son) {
            swap(ord[son],ord[n]);
            swap(v[son],v[n]);
            n=son;
        }
        //cout<<"\n\n";
    }
    while (son);
    //cout<<'\n';
}

inline void inser(int elem)
{
    v[++N]=elem;
    ord[N]=++nrord;
    percolate(N);
}