Cod sursa(job #2742872)

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

void urca( vector <int> &heap, 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( vector <int> &heap, int pozitie ){
    int ok = 1, x;
    while( pozitie*2+2 < heap.size() && 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 == heap.size() && 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( vector <int> heap, int numar ){
    int ok = 1;
    for( int i = 0; i < heap.size() && ok == 1 ; i++ ){
        if( heap[i] == numar ){
            ok = 0;
            return i;
        }
    }
}

int adauga_element( vector <int> &heap, int numar ){
    heap.push_back(numar);
    urca( heap, heap.size()-1 );
}
int elimina_element( vector <int> &heap, int numar ){
    int i = cautare( heap, numar );
    heap[i] = heap[ heap.size() - 1 ];
    heap.pop_back();
    coboara( heap, i );
}

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