Pagini recente » Cod sursa (job #206688) | Cod sursa (job #14731) | Cod sursa (job #422452) | Cod sursa (job #1124751) | Cod sursa (job #2727743)
#include <bits/stdc++.h>
#define Nmax 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
/**
operatia de tipul 1: se insereaza elementul x in multime
operatia de tipul 2: se sterge elementul intrat al x-lea in multime, in ordine cronologica
operatia de tipul 3: se afiseaza elementul minim din multime
*/
int N, cer, x;
int v[Nmax];
int Heap[Nmax];
void change(int x, int y)
{
swap(Heap[x], Heap[y]);
}
int compar(int fiu, int tata)
{
if(Heap[fiu] < Heap[tata])
{
return 1;
}
return 0;
}
void heap_up(int poz)
{
///compar cu tatal
int tata = poz / 2;
if(tata != 0)
{
if(compar(poz, tata) == 1)
{
///schimbam nodurile
change(poz, tata);
///continuam
heap_up(tata);
}
}
}
void adaug(int val)
{
Heap[0]++;
int k = Heap[0];
Heap[k] = val;
heap_up(k);
}
void heap_down(int tata)
{
int fiu = tata * 2;
if(fiu <= Heap[0])///daca fiul exista
{
if(compar(fiu, tata) == 1)
{
change(fiu, tata);
heap_down(fiu);
}
else
{
///verific cu al doilea fiu
fiu++;
if(fiu <= Heap[0])///daca fiul din dreapta exista
{
if(compar(fiu, tata) == 1)
{
change(fiu, tata);
heap_down(fiu);
}
}
}
}
}
int cautare(int val)
{
for(int i=1; i<=Heap[0]; i++)
{
if(Heap[i] == val)
return i;
}
return 0;
}
void stergere(int val)
{
int poz = cautare(val);///pozitia din heap a valorii val
Heap[poz] = INT_MAX;
heap_down(poz);
}
void citire()
{
fin>>N;
for(int i=1; i<=N; i++)
{
fin>>cer;
if(cer == 1 || cer == 2)
{
fin>>x;
///operatia de tipul 1: se insereaza elementul x in multime
if(cer == 1)
{
v[ ++v[0] ] = x;
adaug(x);
}
else
{
///operatia de tipul 2: se sterge elementul intrat al x-lea in multime, in ordine cronologica
int elem = v[ x ];
stergere(elem);
}
}
else
{
fout<<Heap[1]<<"\n";
}
}
}
void afisare()
{
}
int main()
{
citire();
afisare();
return 0;
}