#include<iostream> //#include <stack> usingnamespace std; constint N = 3e6+10; //stack<int> st; int arr[N]; int stack[N]; // 数组实现栈, 内部存的是下标 int ans[N][2]; // 二维的0位置为左侧答案,1位置为右侧答案 int n, r;
intmain(){ cin >> n; for (int i = 0;i<n;i++) cin >> arr[i]; r = 0; int cur; // 遍历阶段 for (int i = 0;i<n;i++){ while(r>0 && arr[stack[r-1]]<=arr[i]){ // 小于等于时看大于当前位置,大于等于反之 cur = stack[--r]; // 当前弹出位置 ans[cur][0] = r>0 ? stack[r-1]:-1; // 左侧最近答案 ans[cur][1] = i; // 右侧最近答案 } stack[r++]=i; } // 清算阶段 while (r>0){ cur = stack[--r]; ans[cur][0] = r>0? stack[r-1]:-1; ans[cur][1] = -1; } // 修正阶段 // 只需要修正右侧答案,从右往左修正,n-1右侧的一定是-1,不需要修正 for(int i = n-2; i>=0; i--){ if(ans[i][1]!=-1 && arr[ans[i][1]]==arr[i]){ ans[i][1] = ans[ans[i][1]][1]; // 现在右侧答案的右侧的答案作为现在右侧的答案 } }
for (int i = 0;i<n;i++){ cout <<ans[i][0]+1<<' '<<ans[i][1]+1<<endl; } }