Cod sursa(job #2268895)

Utilizator EmplopiStefan Nitu Emplopi Data 25 octombrie 2018 14:52:58
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>



using namespace std;



int nh=0, y=0;

int v[200001];

int poz[200001], nr[200001];



void swp(int i, int j){

    int aux;

    aux=v[i];

    v[i]=v[j];

    v[j]=aux;

    poz[v[i]]=i;

    poz[v[j]]=j;

}



void urca(int p){

    while(p>1 && nr[v[p]]<nr[v[p/2]]){

        swp(p, p/2);

        p/=2;

    }

}



void coboara(int p){

    int fs=p*2, fd=p*2+1, bun=p;

    if(fs<=nh && nr[v[fs]]<nr[v[bun]])

        bun=fs;

    if(fd<=nh && nr[v[fd]]<nr[v[bun]])

        bun=fd;

    if(bun!=p){

        swp(p, bun);

        coboara(bun);

    }

}



void adauga(int x){

    v[++nh]=x;

    poz[x]=nh;

    urca(nh);

}



void sterge(int p){

    if(p==nh){

        nh--;

        return;

    }

    v[p]=v[nh--];

    poz[v[p]]=p;

    int cp = p;

    coboara(cp);

    urca(p);

}



int main(){

    FILE *fin, *fout;

    int n, i, caz, val;

    fin=fopen("heapuri.in", "r");

    fout=fopen("heapuri.out", "w");

    fscanf(fin, "%d", &n);

    for(i=1;i<=n;i++){

        fscanf(fin, "%d", &caz);

        if(caz!=3)

            fscanf(fin, "%d", &val);

        else

            fprintf(fout, "%d\n", nr[v[1]]);

        if(caz==1){

            nr[++y]=val;

            adauga(y);

        }

        if(caz==2) {

            //fprintf(fout, "sterg (%d, %d)\n", val, nr[val]);

            sterge(poz[val]);

            //fprintf(fout, "ultim = (%d, %d)\n", v[nh], nr[v[nh]]);

        }

    }

    fclose(fin);

    fclose(fout);



    return 0;

}