Cod sursa(job #1052951)

Utilizator jul123Iulia Duta jul123 Data 11 decembrie 2013 22:28:43
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<iostream>
#include<cstdio>

using namespace std;

int v[200000], heap[200000], k=1, ind[200000];
void swap(int &a, int &b)
{
    int aux;
    aux=a;
    a=b;
    b=aux;
}
void urca(int heap[], int poz)
{
    while(poz>1 &&v[heap[poz]]<v[heap[poz/2]])
        {swap(heap[poz], heap[poz/2]);
        ind[heap[poz]]=poz;
        ind[heap[poz/2]]=poz/2;
        poz/=2;
}
}
void coboara(int heap[], int &n, int poz)
{
    if(2*poz>n) return;
    int poz1=2*poz;
    if(poz1+1<=n && v[heap[poz1]]>v[heap[poz1+1]])
        poz1++;
    if(v[heap[poz1]]<v[heap[poz]])
    {
        swap(heap[poz1], heap[poz]);
        ind[heap[poz1]]=poz1;
        ind[heap[poz]]=poz;
        coboara(heap, n, poz1);
    }
}
void inserare(int heap[], int &n, int val)
{
    n++;
    heap[n]=k;
    ind[k]=n;
    urca(heap, n);
    k++;
}

void el_poz(int heap[],int &n,  int poz)
{
    ind[heap[poz]]=0;
    heap[poz]=heap[n];
    ind[heap[n]]=poz;
    n--;
    if(v[heap[poz]]<v[heap[poz/2]])
        urca(heap, poz);
    else coboara(heap, n, poz);
}
int main()
{
    FILE *fin, *fout;
    fin=fopen("heapuri.in", "r");
    fout=fopen("heapuri.out", "w");

    int i, x, y, n=0, m;
    fscanf(fin, "%d", &m);

    for(i=0; i<m; i++)
       {
        fscanf(fin, "%d", &x);
    if(x==1)
    {
        fscanf(fin, "%d", &y);
        v[k]=y;
        inserare(heap, n, k);

    }
    if(x==2)
    {
        fscanf(fin, "%d", &y);
        el_poz(heap, n, ind[y]);
    }
    if(x==3)
    {

     fprintf(fout, "%d\n", v[heap[1]]);
    }

    }

}