Cod sursa(job #2742874)

Utilizator linte_robertLinte Robert linte_robert Data 22 aprilie 2021 03:56:52
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.52 kb
#include <vector>
#include <iostream>
#include <fstream>
using namespace std;

void urca(int heap[], int n, int pozitie ){
    int ok = 1, x;
    while( ok != 0 && pozitie > 0 ){
        if( heap[(pozitie-1)/2] > heap[pozitie] ){
            x = heap[pozitie];
            heap[pozitie] = heap[(pozitie-1)/2];
            heap[(pozitie-1)/2] = x;
            pozitie = (pozitie - 1)/2;
        }
        else ok = 0;
    }
}

void coboara( int heap[], int n, int pozitie ){
    int ok = 1, x;
    while( pozitie*2+2 < n && ok ==1 ){
        if( heap[pozitie*2+1] < heap[pozitie*2+2] && heap[pozitie*2+1] < heap[pozitie] ){
            x = heap[pozitie];
            heap[pozitie] = heap[pozitie*2+1];
            heap[pozitie*2+1] = x;
            pozitie = pozitie*2+1;
        }
        else{
            if( heap[pozitie*2+2] < heap[pozitie*2+1] && heap[pozitie*2+2] < heap[pozitie] ){
                x = heap[pozitie];
                heap[pozitie] = heap[pozitie*2+2];
                heap[pozitie*2+2] = x;
                pozitie = pozitie*2+2;
            }
            else ok = 0;
        }
    }
    if( pozitie*2+2 == n && heap[pozitie] > heap[pozitie*2+1] ){
        x = heap[pozitie];
        heap[pozitie] = heap[pozitie*2+1];
        heap[pozitie*2+1] = x;
        pozitie = pozitie*2+1;
    }
}

int cautare( int heap[], int n, int numar ){
    int ok = 1;
    for( int i = 0; i < n && ok == 1 ; i++ ){
        if( heap[i] == numar ){
            ok = 0;
            return i;
        }
    }
}

int adauga_element( int heap[], int &n, int numar ){
    heap[n] = numar;
    n++;
    urca( heap, n, n-1 );
}
int elimina_element( int heap[], int &n, int numar ){
    int i = cautare( heap, n, numar );
    heap[i] = heap[ n - 1 ];
    n--;
    coboara( heap, n,  i );
    urca( heap, n, i );
}

int main(){
    ifstream fin( "heapuri.in" );
    ofstream fout( "heapuri.out" );
    int n;
    fin >> n;
    int heap[n];
    int numere[n];
    int hi = 0;
    int ni = 0;
    for( int i = 0; i < n; i++ ){
        int operatie;
        fin >> operatie;
        if( operatie == 1 ){
            int numar;
            fin >> numar;
            numere[ni] = numar;
            ni++;
            adauga_element( heap, hi, numar );
        }
        if( operatie == 2 ){
            int pozitie;
            fin >> pozitie;
            elimina_element( heap, hi, numere[pozitie-1] );
        }
        if( operatie == 3 ){
            fout << heap[0] << endl;
        }
    }
}