Cod sursa(job #3142753)

Utilizator Ana_22Ana Petcu Ana_22 Data 24 iulie 2023 11:08:46
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.36 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#define NMAX 200000

using namespace std;

struct str {
  int true_index;
  int val;
} heap[NMAX];
int heapsize;
int v[NMAX];
int position_in_heap[NMAX];

inline int heap_parent( int i ) { return ( i - 1 ) / 2; }
inline int heap_left( int i ) { return i * 2 + 1; }
inline int heap_right( int i ) { return i * 2 + 2; }

void upHeap( int i, int index ) {
  while( i > 0 && heap[heap_parent(i)].val >= heap[i].val ) {
    swap( position_in_heap[index], position_in_heap[ heap[heap_parent(i)].true_index ] );
    swap( heap[heap_parent(i)], heap[i] );
    i = heap_parent( i );
  }

}

void downHeap( int i ) {
  int left, right, minn;

  left = heap_left( i );
  right = heap_right( i );

  minn = i;

  if( left < heapsize && heap[left].val <= heap[minn].val )
    minn = left;
  if( right < heapsize && heap[right].val <= heap[minn].val )
    minn = right;

  if( i != minn ) {
    swap( position_in_heap[ heap[i].true_index ], position_in_heap[ heap[minn].true_index ] );
    swap( heap[i], heap[minn] );
    downHeap( minn );
  }

}

void heap_insert( int value, int index ) {
  heap[heapsize++].val = value;
  heap[heapsize-1].true_index = index;
  position_in_heap[index] = heapsize - 1;
  upHeap( heapsize - 1, index );
}

int getMin() {
  return heap[0].val;
}

void extractMin() {
  swap( position_in_heap[ heap[0].true_index ], position_in_heap[ heap[heapsize-1].true_index ] );
  swap( heap[0], heap[--heapsize] );
  downHeap( 0 );
}

void update( int i, int value ) {
  heap[i].val = value;
  upHeap( i, heap[i].true_index );
  downHeap( i );
}

void heap_delete( int i ) {
  update( i, getMin() );
  extractMin();
}

int main() {
    FILE *fin, *fout;
    int n, i, tip, x, cnt;
    fin = fopen( "heapuri.in", "r" );
    fout = fopen( "heapuri.out", "w" );
    fscanf( fin, "%d", &n );
    cnt = 0;
    for( i = 0; i < n; i++ ) {
      fscanf( fin, "%d", &tip );
      if( tip == 1 ) {
        fscanf( fin, "%d", &x );
        v[cnt] = x;
        heap_insert( x, cnt );
        cnt++;
      }
      else if( tip == 2 ) {
        fscanf( fin, "%d", &x );
        x--;
        heap_delete( position_in_heap[x] );
      }
      else {
        fprintf( fout, "%d\n", getMin() );
      }
    }
    fclose( fin );
    fclose( fout );
    return 0;
}