Cod sursa(job #780858)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 22 august 2012 13:26:00
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<cstdio>
using namespace std;
int i, a[200001], b[200001], m, k, op, x;
//a=elemente
//b=pe ce pozitie se afla al x-elea inserat in ordine cronologica
void push_up(int poz) {
    int aux;
    if ((a[poz]<a[poz/2])&&(poz>=2)) {
        aux=a[poz]; a[poz]=a[poz/2]; a[poz/2]=aux;
        aux=b[poz]; b[poz]=b[poz/2]; b[poz/2]=aux;
        push_up(poz/2);
    }
}
void push_down(int poz){
    int aux;
    if (2*poz<=a[0]) {
    if ((a[2*poz]<a[2*poz+1])&&(a[2*poz]<a[poz])) {
        aux=a[poz]; a[poz]=a[2*poz]; a[2*poz]=aux;
        aux=b[poz]; b[poz]=b[2*poz]; b[2*poz]=aux;
        push_down(2*poz);
    } else if (a[2*poz+1]<a[poz]) {
        aux=a[poz]; a[poz]=a[2*poz+1]; a[2*poz+1]=aux;
        aux=b[poz]; b[poz]=b[2*poz+1]; b[2*poz+1]=aux;
        push_down(2*poz+1);
    }}
}
int main(){
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d", &m);
    a[0]=0; b[0]=0; a[1]=0; a[2]=0; a[3]=0;
    for (k=1;k<=m;k++) {
        scanf("%d", &op); if ((op==1)||(op==2)) scanf("%d", &x);
        if (op==1) {
            a[++a[0]]=x;
            b[a[0]]=a[0];
            push_up(a[0]); a[a[0]+1]=0; a[a[0]+2]=0;} else
        if (op==2) {
            for (i=1;i<=a[0];i++)
                if (b[i]==x) {
                    a[i]=a[a[0]];
                    b[i]=b[a[0]];
                    a[0]--;
                    push_down(i);
                }
            } else
        if (op==3) {printf("%d\n", a[1]);}
    }
    return 0;
}