Cod sursa(job #1318614)

Utilizator Alex_dudeDudescu Alexandru Alex_dude Data 16 ianuarie 2015 10:18:31
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <algorithm>
#define nmax 200001
using namespace std;
FILE *f1=fopen("heapuri.in","r"),*f2=fopen("heapuri.out","w");
int h[nmax],tmp[nmax],n,k,x,nr;
void CombinaHeap(int i, int n)
{
    int v=h[i],t=i,f=2*i;
    while(f<=n)
    {
        if(f<n)
            if(h[f]<h[f+1])f++;
        if(v<h[f])
        {
            h[t]=h[f];
            t=f;
            f*=2;
        }
        else
            f=n+1;
    }
    h[t]=v;
}

void CreareHeap()
{
    int i;
    for(i=nr/2;i;i--)
    CombinaHeap(i,n);
}
int searchHeap(int x,int i)
{
    if(h[i]==x)return i;
    if(h[2*i]>=x)return searchHeap(x,2*i);
    if(h[2*i+1]>=x)return searchHeap(x,2*i+1);
}
int main()
{

    fscanf(f1,"%d",&n);
    for(int i=1;i<=n;i++)
    {
        int opt;
        fscanf(f1,"%d",&opt);
        if(opt==1)
        {
            fscanf(f1,"%d",&x);
            tmp[++k]=x; nr++;
            h[nr]=x;
            CreareHeap();
        }
        else if(opt==2)
        {
            fscanf(f1,"%d",&x);
            int pos=searchHeap(tmp[x],1);
            h[pos]=h[nr];
            nr--;
            CreareHeap();
        }
        else
        {
           // for(int j=1;j<=nr;j++)fprintf(f2,"%d ",h[j]);fprintf(f2,"\n");
            fprintf(f2,"%d\n",min(h[nr],h[nr-1]));
        }
    }


    fclose(f1);
    fclose(f2);
    return 0;
}

//Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.