Cod sursa(job #1594281)

Utilizator grimmerFlorescu Luca grimmer Data 9 februarie 2016 13:09:50
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int n,siz = 0;
struct node{
    int val,ind;
};
node h[200005];
void up(int poz){
    int k,p;
    k = poz/2;
    p = k;
    if(h[k].val > h[poz].val && poz != 0){
        swap(h[k],h[poz]);
        up(k);
    }
}
void down(int poz){
    int lf_son, rg_son;
    if(poz <= siz/2){
        lf_son = 2*poz;
        rg_son = 2*poz+1;
        if(h[poz].val > h[lf_son].val || h[poz].val > h[rg_son].val){
            if(h[lf_son].val >= h[rg_son].val)
                swap(h[poz],h[rg_son]);
            else
                swap(h[poz],h[lf_son]);
        }
    }
}
int main()
{
    int i,cod,cnt = 0,x,p,j;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for(i=1; i<=n; ++i){
        scanf("%d",&cod);
        if(cod == 1){
            ++cnt;
            scanf("%d",&x);
            h[++siz].val = x;
            h[siz].ind = cnt;
            h[siz+1].val = 1000000001;
            h[siz+1].ind = 200005;
            up(siz);
        }
        if(cod == 2){
            scanf("%d",&x);
            for(j=1; j<=siz; ++j)
                if(h[j].ind == x){
                    p = j;
                    break;
                }
            swap(h[p],h[siz]);
            h[siz].val = 1000000001;
            h[siz].ind = 200005;
            --siz;
            down(p);
        }
        if(cod == 3)
            printf("%d\n",h[1].val);
    }
    return 0;
}