Cod sursa(job #2841626)

Utilizator KarinaDKarina Dumitrescu KarinaD Data 29 ianuarie 2022 23:53:59
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.96 kb
#include <fstream>
#include <iostream>

using namespace std;

const int N = 400001;
int heap [ N ], v [ N ], pozitie [ N ];

int main( ) {
    
    ifstream fin ( "heapuri.in" );
    ofstream fout ( "heapuri.out" );
    
    int n, a, i, k = 1, h = 1, x;
    
    fin >> n;
    
    for ( i = 0; i < n; i++ ){
        
        fin >> a;
        
        if ( a == 1 ){
            
            fin >> v [ k ];
            
            x = h;
            heap [ x ] = k;
            pozitie [ k ] = x;
            
            while ( v [ heap [ x ] ] < v [ heap [ x / 2 ] ] && x > 0 ){
                
                heap [ x ] = heap [ x / 2 ];
                heap [ x / 2 ] = k;
                
                pozitie [ heap [ x ] ] = x;
                pozitie [ heap [ x / 2 ] ] = x / 2;
                
                x = x / 2;
            }
            
            k++;
            h++;
            
        }
        
        else if ( a == 2 ){
            
            fin >> x;
            
            a = pozitie [ x ];
            
            heap [ a ] = heap [ h - 1 ];
            heap [ h - 1 ] = 0;
            pozitie [ heap [ a ] ] = a;
            
            h--;
            
            while ( 2 * a + 1 < h ){
                
                if ( v [ heap [ 2 * a ] ] <= v [ heap [ 2 * a + 1 ] ] && v [ heap [ a ] ] > v [ heap [ 2 * a ] ] ){
                    
                    x = heap [ a ];
                    heap [ a ] = heap [ 2 * a ];
                    heap [ 2 * a ] = x;
                    
                    pozitie [ heap [ a ] ] = a;
                    pozitie [ heap [ 2 * a ] ] = 2 * a;
                    
                    a = a * 2;
                }
                
                else if ( v [ heap [ 2 * a ] ] > v [ heap [ 2 * a + 1 ] ] && v [ heap [ a ] ] > v [ heap [ 2 * a + 1 ] ] ){
                    
                    x = heap [ a ];
                    heap [ a ] = heap [ 2 * a + 1 ];
                    heap [ 2 * a + 1 ] = x;
                    
                    pozitie [ heap [ a ] ] = a;
                    pozitie [ heap [ 2 * a + 1 ] ] = 2 * a + 1;
                    
                    a = a * 2 + 1;
                }
                
                else
                    a = a * 2;
                
            }
            
            if ( 2 * a < h ){
                
                if ( v [ heap [ a ] ] > v [ heap [ 2 * a ] ] ){
                    
                    x = heap [ a ];
                    heap [ a ] = heap [ 2 * a ];
                    heap [ 2 * a ] = x;
                    
                    pozitie [ heap [ a ] ] = a;
                    pozitie [ heap [ 2 * a ] ] = 2 * a;
                }
            }
            
        }
        
        else
            fout << v [ heap [ 1 ] ] << "\n";
        
        //        for ( a = 1; a < h; a++ )
        //            fout << v [ heap [ a ] ] << " ";
        //        fout << " " << h << "\n";
        
    }
    
    return 0;
}