Submission #1050794

#TimeUsernameProblemLanguageResultExecution timeMemory
1050794Ahmed57Railway Trip (JOI17_railway_trip)C++17
100 / 100
198 ms19028 KiB
#include "bits/stdc++.h" using namespace std; int L[100001][20]; int R[100001][20]; int main(){ int n,k,q; cin>>n>>k>>q; int arr[n+1]; for(int i = 1;i<=n;i++){ cin>>arr[i]; } stack<int> st; for(int i = 1;i<=n;i++){ while(!st.empty()&&arr[st.top()]<arr[i])st.pop(); if(!st.empty()){ L[i][0] = st.top(); }else L[i][0] = i; st.push(i); } while(!st.empty())st.pop(); for(int i = n;i>=1;i--){ while(!st.empty()&&arr[st.top()]<arr[i])st.pop(); if(!st.empty()){ R[i][0] = st.top(); }else R[i][0] = i; st.push(i); } for(int j = 1;j<20;j++){ for(int i = 1;i<=n;i++){ L[i][j] = min(L[L[i][j-1]][j-1],L[R[i][j-1]][j-1]); R[i][j] = max(R[R[i][j-1]][j-1],R[L[i][j-1]][j-1]); } } while(q--){ int a,b;cin>>a>>b; int l = min(a,b) , r = min(a,b); int ans = 0; for(int i = 19;i>=0;i--){ if(max(R[l][i],R[r][i])<max(a,b)){ int A = min(L[l][i],L[r][i]); int B = max(R[l][i],R[r][i]); l = A;r = B; ans+=(1<<i); } } int c = r; l = max(a,b); r = max(a,b); for(int i = 19;i>=0;i--){ if(min(L[l][i],L[r][i])>c){ int A = min(L[l][i],L[r][i]); int B = max(R[l][i],R[r][i]); l = A;r = B; ans+=(1<<i); } } cout<<ans<<endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...