Cod sursa(job #1197441)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 11 iunie 2014 23:59:51
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <algorithm>
#define infinit 1<<30
#define maxn 200005
using namespace std;
FILE *f=fopen("heapuri.in","r");
FILE *g=fopen("heapuri.out","w");
int n,nr,a[maxn],v[maxn],pos[maxn];


inline void urca(int nod)
{while (nod>1&&v[nod]<v[nod/2])
                {swap(pos[a[nod]],pos[a[nod/2]]);
                 swap(a[nod],a[nod/2]);
                 swap(v[nod],v[nod/2]);
                 nod=nod/2;
                 }
}
inline void coboara(int nod)
{int son=0;
if (nod*2<=nr) son=nod*2;
if (nod*2+1<=nr&&v[nod*2+1]<v[son]) son=nod*2+1;

if (son!=0) {swap(pos[a[nod]],pos[a[son]]);
             swap(a[nod],a[son]);
             swap(v[nod],v[son]);
             coboara(son);
             }
}

int main()
{int i,j,op,x;
fscanf(f,"%d",&n);
v[0]=infinit;
for (i=1;i<=n;i++) {fscanf(f,"%d",&op);
                    if (op==1) {fscanf(f,"%d",&x);
                                ++nr;
                                v[nr]=x;
                                a[nr]=nr;
                                pos[nr]=nr;
                                urca(nr);
                                } else
                    if (op==2) {fscanf(f,"%d",&x);
                                v[pos[x]]=infinit;
                                coboara(pos[x]);
                                }
                        else fprintf(g,"%d\n",v[1]);
                    }


return 0;
}