#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,b,c;
int z[1000005];
int prv[100005][21];
int nxt[100005][21];
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> a >> b >> c;
for (int i=1;i<=a;i++){
cin >> z[i];
}
stack<int> st;
for (int i=1;i<=a;i++){
while (st.size() && z[st.top()]<z[i]){
st.pop();
}
if (st.size()){
prv[i][0]=st.top();
}else{
prv[i][0]=1;
}
st.push(i);
}
while (st.size()){
st.pop();
}
for (int i=a;i>=1;i--){
while (st.size() && z[st.top()]<z[i]){
st.pop();
}
if (st.size()){
nxt[i][0]=st.top();
}else{
nxt[i][0]=a;
}
st.push(i);
}
for (int j=1;j<=20;j++){
for (int i=1;i<=a;i++){
int u=prv[i][j-1];
int v=nxt[i][j-1];
prv[i][j]=min(prv[u][j-1],prv[v][j-1]);
nxt[i][j]=max(nxt[u][j-1],nxt[v][j-1]);
}
}
while (c--){
int x,y;
cin >> x >> y;
if (x>y){
swap(x,y);
}
int nl=x,nr=x;
int res=0;
for (int i=20;i>=0;i--){
if (max(nxt[nl][i],nxt[nr][i])<y){
res+=1<<i;
int u=nl,v=nr;
nl=min(prv[u][i],prv[v][i]);
nr=max(nxt[v][i],nxt[u][i]);
}
}
// cout << res << " ";
int p=nr;
nl=y,nr=y;
for (int i=20;i>=0;i--){
if (min(prv[nl][i],prv[nr][i])>p){
res+=1<<i;
int u=nl,v=nr;
nl=min(prv[u][i],prv[v][i]);
nr=max(nxt[u][i],nxt[v][i]);
}
}
cout << res << "\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |