Cod sursa(job #1213315)

Utilizator DinaAndreiDina Andrei DinaAndrei Data 27 iulie 2014 20:08:16
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>

using namespace std;

ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");

int f,v[10000],pl[10000],poz,c,p,n,x,y,k;

void swi (int &a, int &b){
    int aux;
    aux=a;
    a=b;
    b=aux;
}

int a;
int main()
{
    fin>>n;
    for(f=1; f<=n; f++){
        fin>>x;               //citirea pana dupa primul if
        if((x==1) || (x==2))
            fin>>y;



        if(x==1){     // adaugarea unui element
            pl[++k]=y;
            poz++;
            v[poz]=y;
            c=poz;
            p=poz/2;
            while (p>0) {
                if(v[c]<v[p]){
                    swi(v[p],v[c]);
                    c=p;
                    p=p/2;
                }else
                    break;
            }

        }

        if (x==2){       // stergerea unui element... nu e un timp extraordinar, dar merge -> n*log2(n)
            a=1;
            while(v[a]!=pl[y])
                a++;
            v[a]=v[poz];
            poz--;
            if(v[a]<v[a/2]){   // cazul in care e mai mare ca tatal sau
                p=a/2; c=a;
                while(p>0){
                    if(v[c]>v[p]){
                        swi(v[p],v[c]);
                        c=p;
                        p=p/2;
                    }else
                        break;
                }
            }else {       // cazul in care e mai mic decat fiul sau
                p=a;
                c=a*2;
                while(c<=poz){
                    if(  (v[c]>v[c+1])&&(c+1 <= poz)    )
                        c++;
                    if(v[c]<v[p]){
                        swi(v[c],v[p]);
                        p=c;
                        c=c*2;
                    }else
                        break;
                }
             }
        }
        if(x==3)      // afisarea celui mai mare element
            fout<<v[1]<<endl;
    }
    return 0;
}