Pagini recente » Monitorul de evaluare | Cod sursa (job #1812303) | Cod sursa (job #662308) | Cod sursa (job #2762160) | Cod sursa (job #3163289)
#include <fstream>
using namespace std;
const int NMAX = 200002;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
pair < int, int > heap[4 * NMAX];
int hsize = 0;
void up(int val)
{
while(val > 1)
{
if(heap[val].first < heap[val / 2].first)
{
swap(heap[val].first, heap[val / 2].first);
swap(heap[val].second, heap[val / 2].second);
val /= 2;
}
else
break;
}
}
void down(int val)
{
int cval = val;
while(val < hsize)
{
int x = val * 2, y = val * 2 + 1;
if(x <= hsize && y <= hsize) ///are 2 copii valizi
{
if(heap[x].first < heap[y].first && heap[val].first > heap[x].first) ///mergem pe st
{
swap(heap[val].first, heap[x].first);
swap(heap[val].second, heap[x].second);
val *= 2;
}
else if(heap[y].first < heap[x].first && heap[val].first > heap[y].first) ///pe dr
{
swap(heap[val].first, heap[y].first);
swap(heap[val].second, heap[y].second);
val = (val * 2) + 1;
}
else ///sau e deja mai mic decat ambele
break;
}
else if(y > hsize && x <= hsize && heap[val].first > heap[x].first) ///are doar un copil valid, in st
{
swap(heap[val].first, heap[x].first);
swap(heap[val].second, heap[x].second);
val *= 2;
}
else ///nu mai are niciun copil valid sau e deja destul de mic
break;
}
val = cval;
}
int main()
{
int n, ok, a, poz = 0;
cin >> n;
while(n--)
{
cin >> ok;
if(ok == 1) ///inserez
{
cin >> a;
poz++;
heap[++hsize].first = a;
heap[hsize].second = poz;
int val = hsize;
up(val);
}
else if(ok == 2) ///sterg
{
int val = 0;
cin >> a;
for(int i = 1; i <= hsize; i++)
{
if(heap[i].second == a) ///am gasit, done
{
val = i;
break;
}
}
swap(heap[val].first, heap[hsize].first); ///le dam swap
swap(heap[val].second, heap[hsize].second);
heap[hsize].first = 0;
heap[hsize].second = 0;
hsize--;
//cout << "heapuri --> " << heap[1].first << " " << heap[2].first << " " << heap[3].first << '\n';
//cout << "size --> " << hsize << '\n';
///down
down(val);
up(val);
}
else
cout << heap[1].first << '\n';
}
return 0;
}