| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 1227732 | abdelhakim | Road Closures (APIO21_roads) | C++20 | 0 ms | 0 KiB | 
#include "jumps.h"
#include <bits/stdc++.h>
#define ll long long
#define inf (ll)(1e15) 
#define dbg(x) cerr <<#x << ' ' << x <<endl;
using namespace std;
ll n;
vector<ll> h;
vector<pair<ll,ll>> mn;
vector<ll> ind;
void init(int N, std::vector<int> H) 
{
  n=N;
  for (int i=0;i<n;i++) h.push_back(H[i]);
  mn.resize(n+1);
  stack<ll> s;
  for (int i=0;i<n;i++)
  {
    while(s.size() && s.top() < h[i])
    {
      s.pop();
    }
    if(s.size())
    {
      mn[h[i]].first=s.top();
    }
    s.push(h[i]);
  }
  while(s.size())s.pop();
  for (int i=n-1;i>=0;i--)
  {
    while(s.size() && s.top() < h[i])
    {
      s.pop();
    }
    if(s.size())
    {
      mn[h[i]].second=s.top();
    }
    s.push(h[i]);
  }
  // for (int i=1;i<=n;i++){
  //   cout <<"here "<< i << ' ' << mn[i].first << ' ' << mn[i].second << endl;
  // }
  ind.resize(n+1);
  for (int i=0;i<n;i++)
  {
    ind[h[i]]=i;
  }
}
int minimum_jumps(int A, int B, int C, int D) {
  vector<ll> dp(n+1,inf);
  for (int i=n;i>=A;i--)
  {
    if(C<=ind[i] && ind[i]<=D)
    {
      dp[i]=0;
      // dbg(i);
    }
    else
    {
      if(mn[i].first!=0) dp[i]=min(dp[i],1+dp[mn[i].first]);
      if(mn[i].second!=0) dp[i]=min(dp[i],1+dp[mn[i].second]);
      // cout << "here " << i <<  ' ' << dp[i] << endl;
    }
  }
  ll ans=inf;
  for (int i=A;i<=B;i++)
  {
    ans=min(ans,dp[h[i]]);
  }
  if(ans==inf)return -1;
  else return ans;
}
