Cod sursa(job #2510464)

Utilizator MihclerioVladimir Chim Mihclerio Data 16 decembrie 2019 19:23:46
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include<bits/stdc++.h>

#define all(s) s.begin(),s.end()
#define rc(x) return cout<<x<<endl,0
#define forn(i,n) for(int i=0;i<int(n);i++)

#define pb push_back
#define mp make_pair
#define fr first
#define sc second

typedef long long ll;
typedef long double ld;

const int nmax=1025;
const int mod=9973;
const ll inf=0x3f3f3f3f3f3f3f3f;

using namespace std;

int n;
vector<int>v,t;

void add(int x)
{
  v.pb(x);
  int i=v.size()-1;
  while(i>0 && v[i]<v[(i-1)/2]) swap(v[i],v[(i-1)/2]),i=(i-1)/2;
}

void erase(int k)
{
  int i=0;
  while(i<v.size() && v[i]!=t[k-1]) i++;
  if(i<v.size())
  {
    swap(v[i],v[v.size()-1]);
    v.pop_back();
    while(1)
    {
      int j=i;
      if(2*i+1<v.size() && v[2*i+1]<v[j]) j=2*i+1;
      if(2*i+2<v.size() && v[2*i+2]<v[j]) j=2*i+2;
      if(j==i) break;
      swap(v[i],v[j]);
      i=j;
    }
  }

}

int main()
{
  ios_base::sync_with_stdio(0); cin.tie(0);
  freopen("heapuri.in","r",stdin);
  freopen("heapuri.out","w",stdout);
  cin>>n;
  while(n--)
  {
    int k;
    cin>>k;
    if(k==1)
    {
      int x;
      cin>>x;
      t.pb(x);
      add(x);
    } else
    if(k==2)
    {
      int x;
      cin>>x;
      erase(x);
    } else cout<<v[0]<<"\n";
  }
}