Cod sursa(job #2103650)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 10 ianuarie 2018 16:42:03
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define def 1000000001
using namespace std;
vector <int> h(200000);
int n,ord[200000];
void up(int x){
    int tata=x/2;
    if(tata!=0 && h[x]<h[tata]){
        swap(ord[x],ord[tata]);
        swap(h[x],h[tata]);
        up(tata);
    }
}

void down(int x){
    int l=2*x, r=2*x+1, minim=def, poz;
    if(l<=n)
        minim=h[l], poz=l;
    if(r<=n && h[r]<minim){
        minim=h[r];
        poz=r;
    }
    if(minim!=def && h[x]>minim){
        swap(h[x],h[poz]);
        swap(ord[x],ord[poz]);
        down(poz);
    }
}



int main()
{
    FILE *fin, *fout;
    int op,x,m,i;
    fin=fopen("heapuri.in","r");
    fout=fopen("heapuri.out","w");
    fscanf(fin,"%d",&m);
    n=0;
    while(m){
        fscanf(fin,"%d",&op);
        if(op==3){
            fprintf(fout,"%d\n",h[1]);
        }
        else{
            fscanf(fin," %d",&x);
            if(op==1){
                h[++n]=x;
                ord[n]=n;
                up(n);
            }
            else{
                for(i=1;ord[i]!=x;i++);
                x=i;
                h[x]=h[n];
                ord[x]=ord[n];
                h[n]=def;
                n--;
                down(x);
            }

        }
        fscanf(fin,"\n");
        m--;
    }
    fclose(fin);
    fclose(fout);
    return 0;
}