Cod sursa(job #2263354)

Utilizator EmplopiStefan Nitu Emplopi Data 18 octombrie 2018 17:11:09
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 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--];
    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;
}