Cod sursa(job #2553823)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 22 februarie 2020 12:09:53
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <cstdio>
using namespace std;

const int N = 200000;

int h[N+1], v[N+1], poz[N+1];
int nh;

void schimba(int p, int q){
    swap(h[p], h[q]);
    poz[h[p]] = p;
    poz[h[q]] = q;
}

void urca(int p){
    while(p>1 && v[h[p]] < v[h[p/2]]){
        schimba(p, p/2);
        p /= 2;
    }
}

void coboara(int p){
    int fs = 2*p;
    int fd = 2*p+1;
    int bun = p;
    if(fs <= nh && v[h[fs]] < v[h[bun]])
        schimba(fs, bun);
    if(fd <= nh && v[h[fd]] < v[h[bun]])
        schimba(fd, bun);
    if(bun != p){
        schimba(p, bun);
        coboara(bun);
    }
}

void adauga(int x){
    h[++nh] = x;
    poz[x] = nh;
    urca(nh);
}

void sterge(int p){
    schimba(p, nh--);
    urca(p);
    coboara(p);
}

int main()
{
    FILE *fin, *fout;
    int n,i,op,x,ins;
    fin = fopen("heapuri.in","r");
    fout = fopen("heapuri.out","w");
    fscanf(fin,"%d",&n);

    ins = 0;
    for(i=1; i<=n; i++){
        fscanf(fin,"%d",&op);
        if(op == 3)
            fprintf(fout,"%d\n",v[h[1]]);
        else{
            fscanf(fin,"%d",&x);
            if(op == 1){
                v[++ins] = x;
                adauga(ins);
            }
            else
                sterge(poz[x]);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}