Cod sursa(job #1296324)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 20 decembrie 2014 22:33:18
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#define dim 200003
using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int v[dim],n,i,o,k,x,poz[dim],j,h[dim];
void insereaza(int x){
    h[++k]=x;
    poz[x]=k;
    int c=k;
    int p=k/2;
    while(p>0){
        if(v[h[p]]>v[h[c]]){
            swap(h[p],h[c]);
            swap(poz[h[c]],poz[h[p]]);
            c=p;
            p/=2;
        }
        else
            break;
    }
}
void sterge_radacina(){
    v[1]=v[k];
    k--;
    int p=1,c=2*p;
    while(c<=k){
        if(c+1<=k && v[c+1]<v[c])
            c++;
        if(v[p]>v[c]){
            swap(v[c],v[p]);
            swap(poz[c],poz[p]);
            p=c;
            c*=2;
        }
        else
            break;
    }
}
void sterge(int x){
    v[x]=-1;
    int c=poz[x];
    int p=c/2;
    while(p>0){
        if(v[h[p]]>v[h[c]]){
            swap(h[c],h[p]);
            swap(poz[c],poz[p]);
            c=p;
            p/=2;
        }
        else break;
    }
    sterge_radacina();
}
int main(){
    fin>>n;
    for(i=1;i<=n;i++){
        fin>>o;
        if(o==1){
            fin>>v[k+1];
            insereaza(k+1);
            continue;
        }
        if(o==2){
            fin>>x;
            sterge(x);
            continue;
        }
        if(o==3){
            fout<<v[1]<<'\n';
        }
    }
    fin.close();fout.close();
    return 0;
}