Pagini recente » Cod sursa (job #434807) | Cod sursa (job #1414476) | Autentificare | Cod sursa (job #154391) | Cod sursa (job #1117794)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <bitset>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <queue>
#include <string>
#include <map>
#include <set>
#define DN 200005
#define INF 200001
#define pb push_back
#define mp make_pair
#define per pair<int,int>
#define LL long long
#define un unsigned
#define x first
#define y second
using namespace std;
int v[DN],arb[4*DN],poz_arb[DN];
/// v[ i ] = al i-lea elemnt inserat
/// arb[i] = pozitia elementului din heap de pe poz i
/// poz_arb[ i ] = pe ce pozitie apare al i-lea element inserat in arbore
void heap_insert(int p){
arb[ ++arb[0] ] = p;
poz_arb[ p ] = arb[0];
for(int nod = arb[0] ; nod && v[ arb[ nod ] ] < v[ arb[nod/2] ] ; nod/=2){
poz_arb[ arb[ nod] ] = nod / 2;
poz_arb[ arb[nod/2] ] = nod;
//swap( poz_arb[nod] , poz_arb[nod/2]);
swap( arb[ nod ], arb[nod/2]);
}
}
void heap_erase(int p){
//cout<<"SWAP :" << arb [ arb[0] ] <<endl;
swap( arb [ poz_arb[p] ] , arb[ arb[0] ] );
arb [ arb[0] ] = INF;
--arb[0];
for(int nod = poz_arb[p] ; v[ arb[nod] ] > min( v[ arb[2*nod] ], v[ arb[ 2*nod + 1 ]] );){
if( v[arb[ 2*nod ]] < v[arb[ 2*nod + 1 ]]){
poz_arb[ arb[nod] ] = 2*nod;
poz_arb[ arb[2*nod] ] = nod;
swap(arb[nod],arb[2*nod]);
nod = 2*nod;
}else{
poz_arb[ arb[nod] ] = 2*nod + 1;
poz_arb[ arb[2*nod+1]] = nod;
swap(arb[nod],arb[2*nod+1]);
nod = 2*nod + 1;
}
}
}
int main()
{
int m;
memset(v,127,sizeof(v)); v[0]=0;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
f>>m;
for(int i=1;i<=m;++i)
arb[i]=INF;
for(;m--;)
{
int op,x;
f>>op;
if(op==1){
f>>x;
v[ ++v[0] ] = x;
heap_insert( v[0] );
}
if(op==2){
f>>x;
//cout<<"Poz_ arb "<<poz_arb[x]<<endl;
heap_erase(x);
}
if(op==3){
g<<v[arb[1]]<<"\n";
}
/*cout<<"ARB:\n";
for(int i=1;i<=arb[0];++i)
cout<<arb[i]<<" ";
cout<<endl;
cout<<"Poz_ARB:\n";
for(int i=1;i<=arb[0];++i)
cout<<poz_arb[i]<<" ";
cout<<endl;*/
}
return 0;
}