Cod sursa(job #1052270)

Utilizator sorinos1357FMI Siman Marius Sorin sorinos1357 Data 10 decembrie 2013 23:40:06
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.46 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

void adaug(int* &v,int* &p,int* &z,int &nr_curent,int &nr_total,int x){
    int aux,poz = nr_curent+1;
    ++nr_curent;
    ++nr_total;
    v[poz ]= x;
    p[nr_total] = poz;
    z[nr_total] = nr_total;
    if(poz != 1)
        while(v[poz] < v[poz/2]){
            aux = v[poz];
            v[poz] = v[poz/2];
            v[poz/2] = aux;

            p[nr_total] = poz/2;
            p [ z [poz/2] ] = poz;

            z[poz] = z[poz/2];
            z[poz/2] = nr_total;

            poz/=2;
            if(poz==1)
                break;
        }
}

void afisez(int* &v){
    g<<v[1]<<"\n";
}

void sterg(int* &v,int* &p,int* &z,int &nr_curent,int nr_total,int x){
    int aux,poz = p[x],poz2;
    aux = v[nr_curent];
    v[nr_curent] = v[p[x]];
    v[p[x]] = aux;
    p[z[nr_curent]] = p[x];
    z[poz] = z[nr_curent];
    --nr_curent;
    while((poz*2 + 1)<=nr_curent){
        if(2*poz < 2*poz + 1)
            poz2 = 2*poz;
        else
            poz2 = 2*poz + 1;
        if(v[poz] > v[poz2]){
            aux = v[poz];
            v[poz] = v[poz2];
            v[poz2] = aux;
            p[z[poz]] = poz2;
            p[z[poz2]] = poz;
            aux = z[poz2];
            z[poz] = z[poz2]; // posibila greseala
            z[poz2] = aux;
            poz = poz2;
        }
        else break;
    }
    if(poz*2 == nr_curent){
        poz2 = nr_curent;
        aux = v[poz];
        v[poz] = v[poz2];
        v[poz2] = aux;
        p[z[poz]] = poz2;
        p[z[poz2]] = poz;
        aux = z[poz2];
        z[poz] = z[poz2]; // posibila greseala
        z[poz2] = aux;
    }
}

int main(){
    int n,*v,*p,*z,nr_curent=0,nr_total=0,comanda,a;
    f>>n;
    v = new int[2000001];
    p = new int[2000001];
    z = new int[2000001];
    for(int i=0;i<n;++i){
        f>>comanda;
        if(comanda == 1){
            f>>a;
            adaug(v,p,z,nr_curent,nr_total,a);
        }
        else if(comanda == 2){
            f>>a;
            sterg(v,p,z,nr_curent,nr_total,a);
        }
        else{
            afisez(v);
        }
    }
    for(int i=1;i<=nr_curent;++i)
        cout<<v[i]<<"  ";
    cout<<endl;
    for(int i=1;i<=nr_total;++i)
        cout<<p[i]<<"  ";
    cout<<endl;
    for(int i=1;i<=nr_total;++i)
        cout<<z[i]<<"  ";
    cout<<endl;
    return 0;
}