Submission #1322208

#TimeUsernameProblemLanguageResultExecution timeMemory
1322208loomRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
607 ms282984 KiB
#include<bits/stdc++.h>
using namespace std;
#define inf (int)2e9
#define _ <<' '<<
#define nl '\n'

void solve(){
   int n, k, m;
   cin>>n>>k>>m;

   vector<int> in[n], out[n];
   for(int i = 0; i < m; i++){
      int a, b;
      cin>>a>>b;
      a--, b--;

      in[a].push_back(b);
      out[a < b ? min(b-1, a+k-1) : max(b+1, a-k+1)].push_back(b);
   }

   multiset<int> st;
   int l[n][18], r[n][18];

   for(int i = 0; i < n; i++){
      for(int b : in[i]){
         if(i < b) st.insert(b);
      }

      r[i][0] = (st.empty() ? i : *st.rbegin());

      for(int b : out[i]){
         if(i < b) st.erase(st.find(b));
      }
   }

   st.clear();

   for(int i = n-1; i >= 0; i--){
      for(int b : in[i]){
         if(i > b) st.insert(b);
      }

      l[i][0] = (st.empty() ? i : *st.begin());

      for(int b : out[i]){
         if(i > b) st.erase(st.find(b));
      }
   }

   int lg[n+1];

   for(int i = 1, p = 1, c = 0; i <= n; i++){
      if(p * 2 <= i) p *= 2, c++;
      lg[i] = c;
   }

   int ml[n][18][18], mr[n][18][18];

   auto qry = [&](int w, int j, int l, int r){
      int c = lg[r-l+1];

      if(!w) return min(ml[l][j][c], ml[r - (1<<c) + 1][j][c]);
      return max(mr[l][j][c], mr[r - (1<<c) + 1][j][c]);
   };

   for(int j = 0; j < 18; j++){
      for(int i = 0; i < n; i++){
         if(!j) continue;

         l[i][j] = qry(0, j-1, l[i][j-1], r[i][j-1]);
         r[i][j] = qry(1, j-1, l[i][j-1], r[i][j-1]);
      }

      for(int k = 0; k < 18; k++){
         for(int i = 0; i + (1<<k) - 1 < n; i++){
            if(k == 0){
               ml[i][j][k] = l[i][j];
               mr[i][j][k] = r[i][j]; 
               continue;
            }

            ml[i][j][k] = min(ml[i][j][k-1], ml[i + (1<<k-1)][j][k-1]);
            mr[i][j][k] = max(mr[i][j][k-1], mr[i + (1<<k-1)][j][k-1]);
         }
      }
   }

   int q;
   cin>>q;

   while(q--){
      int a, b;
      cin>>a>>b;
      a--, b--;

      int cl = a, cr = a, ans = 1;

      for(int j = 17; j >= 0; j--){
         int ncl = qry(0, j, cl, cr);
         int ncr = qry(1, j, cl, cr);
         if(ncl <= b and b <= ncr) continue;

         cl = ncl;
         cr = ncr;
         ans += 1<<j;
      }

      cout<<(ans > m ? -1 : ans)<<nl;
   }
}

signed main(){
   ios_base::sync_with_stdio(0);
   cin.tie(NULL);cout.tie(NULL);

   int t = 1;
   //cin>>t;
   while(t--) solve();

   return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...