제출 #1208402

#제출 시각아이디문제언어결과실행 시간메모리
1208402mychecksedadRailway Trip (JOI17_railway_trip)C++20
20 / 100
2093 ms33728 KiB
/* Author : Mychecksdead  */
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
#define ff first
#define ss second
#define pii pair<int,int>
#define vi vector<int>
const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30;

struct Fenwick{
  vector<int> t;
  Fenwick(int n){
    t.resize(n + 1);
  }
  void add(int v){
    while(v < t.size()){
      t[v]++;
      v += v & -v;
    }
  }
  int get(int v){
    int res=0;
    while(v > 0){
      res+=t[v];
      v -= v&-v;
    }
    return res;
  }
};


int n, k, q, a[N];
vector<int> g[N];
void solve(){
  cin >> n >> k >> q;
  vector<vi> C(k + 1);
  for(int i = 1; i <= n; ++i){
    cin >> a[i];
    C[a[i]].pb(i);
  }
  // Fenwick fw(n);
  // for(int i = k; i >= 1; --i){
  //   for(int x: C[i]) fw.add(x);
  //   for(int j = 0; j + 1 < C[i].size(); ++j){
  //     int w = fw.get(C[i][j + 1]) - fw.get(C[i][j]);
  //     g[C[i][j]].pb({C[i][j + 1], w});
  //     g[C[i][j + 1]].pb({C[i][j], w});
  //   }
  // }
  vector<pii> Q;
  for(int i = 1; i <= n; ++i){
    while(Q.size() && Q.back().ff < a[i]) Q.pop_back();
    if(Q.size()){
      int v = i;
      int u = Q.back().ss;
      g[u].pb(v);
      g[v].pb(u);
    }
    Q.pb({a[i], i});
  }
  Q.clear();
  for(int i = n; i >= 1; --i){
    while(Q.size() && Q.back().ff < a[i]) Q.pop_back();
    if(Q.size()){
      int v = i;
      int u = Q.back().ss;
      g[u].pb(v);
      g[v].pb(u);
    }
    Q.pb({a[i], i});
  }

  for(int i = 1; i <= q; ++i){
    int l, r; cin >> l >> r;
    vector<int> dist(n + 1, N);
    dist[l] = 0;
    queue<int> qq;
    qq.push(l);
    while(qq.size()){
      int v = qq.front(); qq.pop();
      for(int u: g[v]){
        if(dist[u] == N){
          dist[u] = dist[v] + 1;
          qq.push(u);
        }
      }
    }

    cout << dist[r] - 1 << '\n';
  }
}


int main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tt = 1, aa;
  // freopen("in.txt", "r", stdin);
  // freopen("out.txt", "w", stdout);
  while(tt--){
    solve();
    en;
  }
  cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n";
  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...