Pagini recente » Cod sursa (job #1392405) | Cod sursa (job #1106401) | Cod sursa (job #905230) | Cod sursa (job #2181670) | Cod sursa (job #3038308)
#include <iostream>
#include <fstream>
#include <unordered_map>
#define maxi 200005
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n,heap[maxi],op,x,coada[maxi],k,dim;
unordered_map<int,int> pos;
void promovare(int n,int k)
{
bool ok=false;
while(k>1&&!ok)
{
if(heap[k>>1]<heap[k])
ok=true;
else{
swap(pos[heap[k]],pos[heap[k>>1]]);
swap(heap[k>>1],heap[k]);
k>>=1;
}
}
return;
}
inline int minim()
{
return heap[1];
}
void cernere(int n,int k)
{
bool ok=false;
while(2*k<=n&&!ok)
{
int p=2*k;
if(p+1<=n)
{
if(heap[p+1]<heap[p])
p++;
}
if(heap[k]<heap[p])
ok=true;
else{
swap(pos[heap[k]],pos[heap[p]]);
swap(heap[k],heap[p]);
k=p;
}
}
return;
}
void eliminare(int&n,int k)
{
swap(heap[k],heap[n]);
n--;
if(k>1&&heap[k]<heap[k>>1])
promovare(n,k);
else cernere(n,k);
return;
}
void queries()
{
f>>n;
for(int i=1;i<=n;i++)
{
f>>op;
switch(op)
{
case 1:{
f>>x;
coada[++k]=x;
heap[++dim]=x;
pos[x]=dim;
promovare(dim,dim);
}break;
case 2:{
f>>x;
eliminare(dim,pos[coada[x]]);
}break;
case 3:{
g<<minim()<<'\n';
}break;
}
}
f.close();
g.close();
return;
}
int main()
{
queries();
return 0;
}