Cod sursa(job #1260373)

Utilizator andi12Draghici Andrei andi12 Data 11 noiembrie 2014 10:51:26
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>

using namespace std;
const int N=200001;
int p[N];
int heap[N];
int v[N];
int nr,m;
void schimba(int x,int y)
{
    int aux;
    aux=heap[x];
    heap[x]=heap[y];
    heap[y]=aux;
    p[heap[x]]=x;
    p[heap[y]]=y;
}
void up(int poz)
{
    if(poz/2>0 && v[heap[poz]]<v[heap[poz/2]])
    {
        schimba(poz,poz/2);
        up(poz/2);
    }
}
void down(int poz)
{
    int bun=poz,fs=2*poz,fd=2*poz+1;
    if(fs<=nr && v[heap[fs]]<v[heap[bun]])
        bun=fs;
    if(fd<=nr && v[heap[fd]]<v[heap[bun]])
        bun=fd;
    if(bun!=poz)
    {
        schimba(poz,bun);
        down(bun);
    }
}
void ad(int x)
{
    nr++;
    m++;
    v[m]=x;
    p[m]=nr;
    heap[nr]=m;
    up(nr);
}
void del(int x)
{
    int poz=p[x];
    heap[poz]=heap[nr];
    nr--;
    up(poz);
    down(poz);
}
int main()
{
    FILE *in,*out;
    in=fopen("heapuri.in","r");
    out=fopen("heapuri.out","w");
    int cod,n,x,i;
    fscanf(in,"%d",&n);
    for(i=1;i<=n;i++)
    {
        fscanf(in,"%d",&cod);
        if(cod!=3)
        {
            fscanf(in,"%d",&x);
            if(cod==1)
                ad(x);
            else
                del(x);
        }
        else
            fprintf(out,"%d\n",v[heap[1]]);
    }
    return 0;
}