제출 #371012

#제출 시각아이디문제언어결과실행 시간메모리
371012nickmet2004Railway Trip (JOI17_railway_trip)C++11
100 / 100
541 ms16620 KiB
#include<bits/stdc++.h>

using namespace std;
const int N = 1e5 + 5;
int n , k , q , a[N];
int L[17][N] , R[17][N];
int main (){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> k >> q;
    for(int i = 1; i <= n; ++i)cin >> a[i];
    for(int i = n; i; --i){
        R[0][i] = i + 1;
        while(R[0][i] <= n && a[R[0][i]] < a[i]) R[0][i] = R[0][R[0][i]];
    }
    for(int i = 1; i <= n; ++i){
        L[0][i] = i - 1;
        while(L[0][i] && a[L[0][i]] < a[i]) L[0][i] = L[0][L[0][i]];
    }
    L[0][1]= 1; R[0][n] = n;
    for(int i = 1; i < 17; ++i){
        for(int j= 1; j<= n; ++j){
            L[i][j] = min(L[i - 1][L[i - 1][j]] , L[i - 1][R[i - 1][j]]);
            R[i][j] = max(R[i - 1][R[i - 1][j]] , R[i - 1][L[i - 1][j]]);
        }
    }
    while(q--){
        int a , b;
        cin >> a >> b;
        if(a>b)swap(a,b);
        int l = a , r= a , ans = 0 ,c;
        for(int i = 16; ~i; --i){
            if(max(R[i][l] , R[i][r]) < b){
                int x = l , y = r;
                l= min(L[i][x] , L[i][y]); r=max(R[i][x] , R[i][y]);
                ans += 1 << i;
            }
        }
        c = r;
        l = b , r = b;
        for(int i = 16; ~i; --i){
            if(min(L[i][l] , L[i][r]) > c){
                int x = l , y = r;
                l= min(L[i][x] , L[i][y]); r=max(R[i][x] , R[i][y]);
                ans += 1 << i;
            }
        }
        cout << ans << endl;
    }
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...