Cod sursa(job #2293739)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 1 decembrie 2018 15:08:44
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
//#include <bits/stdc++.h>
#include <fstream>
#include <vector>
#include <bitset>
#include <unordered_map>
#include <algorithm>
#include <queue>
#include <math.h>
#include <iomanip>
#include <stack>
#include <string.h>
#include <set>
 
using namespace std;
 
ifstream in("heapuri.in");
ofstream out("heapuri.out");
 
#define F first
#define S second

const int INF = 0x3f3f3f3f;
const int DIM = 2e5 + 17;

pair <int, int> v[DIM];

int nr, p[DIM];

void up(int nod)
{
    if(nod >= 1)
    {
        if(v[nod].S < v[nod / 2].S)
        {
            swap(v[nod], v[nod / 2]);
            p[v[nod].F] = nod;
            p[v[nod / 2].F] = nod / 2;
            up(nod / 2);
        }
    }
}

void down(int nod)
{
    if(nod * 2 + 1 <= nr && (v[nod].S > v[nod * 2].S || v[nod].S > v[nod * 2 + 1].S))
    {
        if(v[nod * 2].S < v[nod * 2 + 1].S)
        {
            swap(v[nod], v[nod * 2]);
            p[v[nod].F] = nod;
            p[v[nod * 2].F] = nod * 2;
            down(nod * 2);
        }
        else
        {
            swap(v[nod], v[nod * 2 + 1]);
            p[v[nod].F] = nod;
            p[v[nod * 2 + 1].F] = nod * 2 + 1;
            down(nod * 2 + 1);
        }
    }
    else 
		if(nod * 2 <= nr && v[nod].S > v[nod * 2].S)
		{
			swap(v[nod], v[nod * 2]);
			p[v[nod].F] = nod;
			p[v[nod * 2].F] = nod * 2;
			down(nod * 2);
		}
}

main()
{
	int n;
    in >> n;
	
    for(int i = 1; i <= n; i++)
    {
		int op;
        in >> op;
        
		if(op == 1)
        {
			int x;
            in >> x;
			
            nr++;
            v[nr].S = x;
            v[nr].F = nr;
            p[v[nr].F] = nr;
            up(nr);
        }
        else 
			if(op == 2)
			{
				int poz;
				
				in >> poz;
				v[p[poz]].S = INF;
				down(p[poz]);
			}
			else
				out << v[1].S << '\n';
    }
}