Pagini recente » Cod sursa (job #1459124) | Cod sursa (job #1406825) | Cod sursa (job #2139187)
#include <bits/stdc++.h>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int nx=200002;
int pozh[nx],pozv[nx],h[nx],nh,nv,op,x,n;
/// pozh[i] - pozitia in heap al celui de-al i-lea nr din sir
/// pozv[i] - pozitia in sir al nodului i din heap;
void go_up (int x) /// fac nodul x sa urce in heap, daca se poate
{
if(x==1) return;
if(h[x]>=h[x/2]) return; /// daca tatal e mai mic decat nu urc
swap(h[x],h[x/2]); /// interschimb valorile din noduri
swap(pozh[pozv[x]],pozh[pozv[x/2]]); /// interschimb pozitiile lor in heap
swap(pozv[x],pozv[x/2]);/// interschimb si pozitiile lor in sir
go_up(x/2); /// incerc sa urc si mai mult
}
void go_down (int x) /// cobor nodul x in heap, daca se poate
{
int fiu=0;
if(2*x<=nh) /// daca exista fiu stang
{
fiu=2*x;
if(fiu+1<=nh && h[fiu+1]<h[fiu]) /// verific daca am fiu drept si daca este fiul de valoare minima
fiu++; /// daca da atunci iau drept fiu pe cel drep
if(h[fiu]>=h[x]) /// daca fiul are o valoare mai mare decat cea a lui x
fiu=0; /// atunci nu are sens sa il cobor
}
if(fiu)
{
swap(h[fiu],h[x]); /// schimb valorile din heap
swap(pozh[pozv[fiu]],pozh[pozv[x]]); /// schimb pozitiile din heap
swap(pozv[fiu],pozv[x]); /// schimb pozitiile din sir
go_down(fiu); /// cobor si fiul , daca se poate
}
}
void push (int x) /// il adaug pe x in heap
{
nh++;
nv++;
pozh[nv]=nh; /// e ultimul nod din heap
pozv[nh]=nv; /// de asemenea ultimul din sir
h[nh]=x; /// il pun pe ultimul nod din heap
go_up(nh); /// il urc in heap, daca se poate
}
void pop (int x) /// sterg al x-lea numar din sir din heap
{
int poz=pozh[x]; /// aflu pe ce nod se afla al x-lea nr in heap
swap(h[poz],h[nh]);
/// il interschimb cu ultimul nod
nh--; /// si il elimim;
go_up(poz);
go_down(poz);
/// apoi aflu pozitia crespunzatoare a nodului poz in heap
}
int main()
{
for(in>>n;n;n--)
{
in>>op;
if(op!=3)
in>>x;
if(op==1)
push(x);
else if(op==2)
pop(x);
else if(op==3)
out<<h[1]<<'\n';
}
return 0;
}