思路
由于deque的前两个比较中会把大的留在第一位,因此最终第一位的值是固定的而后面的部分没有比第一个大的会陷入循环。所以模拟题目给的操作并记录直到最大的来到第一位后停止,这时要求的操作数小于模拟次数就直接给出记录的答案,其余情况由于除第一位外处于循环也能直接定位到。
实现
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
int n,q;
int ans[maxn][2];
deque<int> Stack;
void solve(){
cin>>n>>q;
int maxnum = -1;
for(int i=1,num;i<=n;i++){
cin>>num;Stack.push_back(num);
maxnum = max(maxnum,num);
}
long long cnt = 1;
while(Stack[0]!=maxnum){
int a = Stack.front();Stack.pop_front();
int b = Stack.front();Stack.pop_front();
ans[cnt][0] = a,ans[cnt][1] = b;
cnt++;
if (a>b) Stack.push_front(a),Stack.push_back(b);
else Stack.push_front(b),Stack.push_back(a);
}
long long num;
for (int i=1;i<=q;i++){
cin>>num;
if (num<cnt)
cout<<ans[num][0]<<" "<<ans[num][1]<<endl;
else
cout<<Stack[0]<<" "<<Stack[(num-cnt)%(n-1)+1]<<endl;
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
solve();
}