Cod sursa(job #1288389)

Utilizator andreeadeacAndreea Ioana Deac andreeadeac Data 8 decembrie 2014 19:47:04
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>
using namespace std;
ifstream in ("heapuri.in");
ofstream out("heapuri.out");
const int N=200001;
int v[N], h[N], poz[N];
int n,nh,nr;
/*
arbore binar "compact"
h[1] = radacina
h[2*i] = fiul stang al lui i
h[2*i+1] = fiul drept al lui i
inaltimea = [logN]

heap: pentru orice i h[i] e mai bun ca h[2*i] si ca h[2*i+1] => cel mai bun e h[1]

urcare(i):
    while (i >= 2 && h[i] e mai bun ca h[i/2]){
        schimba(i, i/2);
        i /= 2;
    }

coborare(i):
    int fs = 2*i, fd = 2*i + 1, bun = i;
    if (fs <= nh && h[fs] e mai bun ca h[i])
        bun = fs;
    if (fd <= nh && h[fd] e mai bun ca h[i])
        bun = fd;
    if (bun != i) {
        schimba(i, bun);
        coboara(bun);
    }

pentru arhiva educationala:
v[i] = al i-lea citit
h[i] = pozitia din v a celui care se afla in heap pe pozitia i => optimul va fi v[h[1]]
poz[i] = pozitia din heap a celui care a fost citit al i-lea
poz[h[i]] = i
h[poz[i]] = i

sterge(i):
    schimba(i, nh--);
    urca(i);
    coboara(i);
*/

void schimba (int x, int y){
    int a=h[x];
    h[x]=h[y];
    h[y]=a;
    poz[h[x]]=x;   //?
    poz[h[y]]=y;   //?
}
void urcare(int i){
    while(i>=2 && v[h[i]]<v[h[i/2]]){
        schimba(i,i/2);
        i/=2;
    }
}
void coborare(int i){
     int fs = 2*i, fd = 2*i + 1, bun = i;
    if (fs <= nh && v[h[fs]] < v[h[i]])
        bun = fs;
    if (fd <= nh && v[h[fd]] < v[h[i]])
        bun = fd;
    if (bun != i) {
        schimba(i, bun);
        coborare(bun);
    }
}

int main(){
    in>>n;
    int i,a,x;
    for(i=1;i<=n;i++){
        in>>a;
        if(a==1 || a==2){
            in>>x;
        }
        if(a==1){
            nh++;
            v[++nr]=x;
            h[nh]=nr;
            poz[h[nh]]=nh;
            urcare(nh);
        }
        if(a==2){
            x=poz[x];
            schimba(x,nh--);
            urcare(x);
            coborare(x);
        }
        if(a==3)
            out<<v[h[1]]<<"\n";
        //for(int j=1;j<=nh;j++)
        //    out<<v[j]<<" "<<h[j]<<" "<<poz[j]<<"\n";
    }
    return 0;
}