Cod sursa(job #755507)

Utilizator rayvianPricope Razvan rayvian Data 5 iunie 2012 22:54:55
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <fstream>
#include <iostream>
using namespace std;
const int MAX_N=1000002;

int heap[MAX_N];
int heaps;

int pos[MAX_N]; /* pos[k] spune pozitia elementului k in heap */
int timeline[MAX_N]; /** timeline[k] spune ce element a intrat la timpul k*/



void swap_heaps(int node1,int node2)
{
  swap(pos[node1],pos[node2]);
  swap(heap[pos[node1]],heap[pos[node2]]);
}
void promote_heap(int val);

void push_heap(int val)
{
  heaps++;
  heap[heaps] = val;
  pos[val] = heaps;
  promote_heap(val);
}

void promote_heap(int val)
{
  int elem = pos[val];
  while(1)
  {
    if(elem == 1)
      break;

    int tatal = elem/2;
    if(heap[tatal] > heap[elem])
    {
      swap_heaps(heap[tatal],heap[elem]);
      elem = tatal;
    }
    else
      break;
  }
}

void demote_heap(int element)
{
  int pose = pos[element];

  while(1)
  {
    int stanga = pose*2;
    int dreapta = pose*2+1;

    if(stanga <= heaps)
      if(heap[pose] > heap[stanga])
      {
        swap_heaps(heap[pose],heap[stanga]);
        pose = stanga;
        continue;
      }

    if(dreapta <= heaps)
      if(heap[pose] > heap[dreapta])
      {
        swap_heaps(heap[pose],heap[dreapta]);
        pose = dreapta;
        continue;
      }

    if(dreapta >= heaps && stanga >=heaps)
      break;

    break;
  }
}
void pop_heap(int element)
{
  if(heaps == 1)
  {
    heaps--;
    return ;
  }
  int pozitie = pos[element];
  swap_heaps(element,heap[heaps]);
  heaps--;
  

  if(pozitie == 1)
  {
    demote_heap(heap[pozitie]);
    return ;
  }


  int parent = pozitie / 2;
  if(heap[parent] > heap[pos[element]])
    promote_heap(heap[pozitie]);
  else 
    demote_heap(heap[pozitie]);
 
  
}

int main()
{

  ifstream fin("heapuri.in");
  ofstream fout("heapuri.out");

  int n;
  fin>>n;
  int timp = 1;
  for(int i = 1; i<=n; i++)
  {
    int id,val;
    fin>>id;

    if(id == 1)
    {
      fin>>val;
      push_heap(val);
      timeline[timp] = val;
      timp++;
    }
    else if(id == 2)
    {
      fin>>val;
      pop_heap(timeline[val]);
    }
    else if(id == 3)
      fout<<heap[1]<<endl;
  }
  return 0;
}