Cod sursa(job #1074271)

Utilizator dan.ghitaDan Ghita dan.ghita Data 7 ianuarie 2014 13:49:21
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
unordered_map<int, int> h;
int n=0, v[500005], m, p, x, t, del[500000];
void push(int x)
{
    v[++n]=x;
    h[x]=n;
    int p=n;
    while(v[p]<v[p/2]&&p>1)
        swap(v[p], v[p/2]), swap(h[v[p]], h[v[p/2]]), p/=2;
    cout<<"hash de "<<x<<" e "<<h[x]<<'\n';
    if(x<=28) cout<<"------->"<<h[28]<<'\n';
}

void pop(int poz)
{
    //g<<v[x]<<' ';
    swap(v[poz], v[n--]);
    swap(h[poz], h[n]);
    p=poz;

    while(v[p]<v[p/2]&&p>1)
        swap(v[p], v[p/2]), swap(h[v[p]], h[v[p/2]]), p/=2;

    int s;
    while(2*p<=n)
    {
        s=2*p;
        if(2*p+1>n)
        {
            if(v[p]>v[s]) swap(v[p], v[s]), swap(h[v[p]], h[v[s]]);
            break;
        }
        else
        {
            if(v[s]<=v[s+1]&&v[p]>v[s]) swap(v[p], v[s]), swap(h[v[p]], h[v[s]]);
            else if(v[p]>v[s+1]) swap(v[p], v[s+1]), swap(h[v[p]], h[v[s+1]]), s++;
        }
        p=s;
    }
    if(del[x]<=28) cout<<"------->"<<del[x]<<' '<<h[28]<<'\n';
}
int main()
{
    f>>m;
    int i=0;
    while(m--){
        f>>t;
        if(t==1) f>>x, push(x), del[++i] = x;
        if(t==2) f>>x, cout<<"sterg: "<<x<<' '<<del[x]<<" de pe pozitia "<<h[del[x]]<<'\n', pop(h[del[x]]);//
        if(t==3) g<<v[1]<<'\n';



    }

    return 0;
}