Cod sursa(job #1816454)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 26 noiembrie 2016 15:16:03
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 3.13 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];
            p = nr;
            c = 2*nr;
            v[nr] = v[k];
            w[nr] = w[k];
            poz[w[nr]] = poz[w[k]];
            k--;
            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";


    }

/*
    for (i=1;i<=n;i++){
        fin>>nr;
        if (nr == 1){
            // adaugam elemtul x in multime
            fin>>w[i]; // elementele introduse, in ordine

            v[++k] = w[i];

            c = k;
            p = c/2;
            poz[++k2] = c;
            while (v[c] < v[p]){
                swap (v[c],v[p]);
                //poz[c] = p;
                //poz[p] = c;
                poz[p] = c;
                poz[k] = p;
               // swap (poz[c],poz[p]);
                c = p;
                p /= 2;
            }
            // pozitia pe care se gaseste al i-lea element intrat in multime, din v
            //v[k2].s = c;
        }
        if (nr == 2){
            // stergem al x lea elemt intrat in multime
            fin>>x;
            v[poz[x]] = v[k];
            //poz[x] = k;//****************
            //poz[k] = poz[x];
            poz[x] = 0;
            k--;
            // refacem heapul si pozitiile
            p = poz[x];
            c = 2*p;
            while (c <= k){
                if (c+1 <= k && v[c+1] < v[c])
                    c++;
                if (v[p] > v[c]){
                    swap (v[p],v[c]);
                    poz[p] = c;

                    //poz[x] = p;
                    //swap (poz[p],poz[c]);
                    p = c;
                    c = 2*c;
                }
                else
                    break;
            }
        }
        if (nr == 3){
            fout<<v[1]<<"\n";
        }
    }


*/

    return 0;
}