Cod sursa(job #1816459)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 26 noiembrie 2016 15:23:18
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <fstream>

using namespace std;
int v[200001],poz[200001],i,j,n,k,k2,c,p,x,nr,w[200001],N;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");

int main (){

    fin>>n;
    for (i=1;i<=n;i++){
        fin>>nr;
        if (nr == 1){
            fin>>x;
            k++;
            N++;
            v[k] = x; // heap
            w[k] = N; // pozitiile in care au fost inserate numerele
            poz[N] = k; // pozitia din heap a unui element
            c = k;
            p = c/2;
            while (p>=0){
                if (v[c] < v[p]){
                    swap (v[c],v[p]);
                    swap (w[c],w[p]);
                    poz[w[p]] = p;
                    poz[w[c]] = c;
                    c = p;
                    p = p/2;
                }
                else
                    break;
            }

        }
        if (nr == 2){
            fin>>x;
            nr = poz[x];
            c = nr;
            p = c/2;
            v[nr] = v[k];
            w[nr] = w[k];
            poz[w[nr]] = poz[w[k]];
            k--;
            if (v[c] < v[p]){
                //c = nr;
                //p = c/2;
                while (p>=0){
                    if (v[c] < v[p]){
                        swap (v[c],v[p]);
                        swap (w[c],w[p]);
                        poz[w[p]] = p;
                        poz[w[c]] = c;
                        c = p;
                        p = p/2;
                    }
                    else
                        break;
                }

            }
            else{
                p = nr;
                c = 2*nr;
                while (c<=k){
                    if (c+1 <= k && v[c+1] < v[c])
                        c++;
                    if (v[c] < v[p]){
                        swap (v[c],v[p]);
                        swap (w[c],w[p]);
                        poz[w[p]] = p;
                        poz[w[c]] = c;
                        p = c;
                        c = 2*p;
                    }
                    else
                        break;

                }
            }

        }
        if (nr == 3)
            fout<<v[1]<<"\n";


    }



    return 0;
}