Cod sursa(job #333758)

Utilizator levap1506Gutu Pavel levap1506 Data 23 iulie 2009 19:21:46
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#define maxn 200000
using namespace std;
int N, dist[maxn+100],poz[maxn+100], heap[maxn+100], hind,cod,a,posix;
inline void swap(int i, int j)
{
int z;

    z=heap[i];
    heap[i]=heap[j];
    heap[j]=z;
    int t=poz[heap[i]];
    poz[heap[i]]=poz[heap[j]];
    poz[heap[j]]=t;

}
inline void upheap(int);
inline void add(int a) {
    heap[++hind]=++posix;
    poz[posix]=hind;
    dist[posix]=a;
    upheap(hind);
}
inline void downheap(int);
inline void dellete(int i) {
    int r=poz[i];
    swap(poz[i],poz[heap[hind]]);
    //heap[poz[i]]=heap[hind];
    //poz[heap[hind]]=poz[i];
    poz[i]=-1;
    heap[hind]=0;
    hind--;
    downheap(poz[heap[r]]);
}
inline void upheap(int i) {
    while (i/2>0&&dist[heap[i]]<dist[heap[i/2]])
    {
        swap(i,i/2);
        i/=2;
    }
}
inline void downheap(int i) {
    while ((2*i<=hind&&dist[heap[i]]>dist[heap[2*i]])||(2*i+1<=hind&&dist[heap[i]]>dist[heap[2*i+1]]))
    {
        if (2*i+1<hind&&dist[heap[2*i+1]]<dist[heap[2*i]])
         {
             swap(2*i+1,i);
             i=2*i+1;
         }
         else
         {
             swap(2*i,i);
             i=2*i;
         }
    }
}
int main() {
    ifstream in;
    ofstream out;
    in.open("heapuri.in");
    out.open("heapuri.out");
    in >> N;
    for (int i=0;i<N;i++) {
        in >> cod;
        if (cod<3) in >> a;
        switch (cod) {
            case 1:add(a);
            break;
            case 2:dellete(a);
            break;
            case 3: out << dist[heap[1]]<<"\n";
            break;
        }
    }
    out.close();
}