解法:
离线 + 单调栈
Code:
const int MX = 2e5 + 7;
int a[MX];
struct node{
int id;
int y;
};
vector<node>q[MX];
void solve(int n,int m){
int ans[MX];
int head = 0,tail = 0;
int que[MX];
for(int i = n;i > 0;--i){
while(head < tail && a[i] >= a[que[tail-1]]) tail--;
que[tail++] = i;
if((int)q[i].size() == 0) continue;
for(auto to : q[i]){
if(tail - to.y < 0) ans[to.id] = -1;
else{
ans[to.id] = que[tail - to.y];
}
}
}
for(int i = 1;i <= m;++i){
printf("%d\n", ans[i]);
}
}
void init(int n){
for(int i = 1;i <= n;++i){
q[i].clear();
}
}
int main(){
int T;scanf("%d",&T);
while(T--){
int n,m;scanf("%d %d",&n,&m);
for(int i = 1;i <= n;++i){
scanf("%d",&a[i]);
}
for(int i = 1;i <= m;++i){
int x,y;
scanf("%d %d",&x,&y);
q[x].pb((node){i,y});
}
solve(n,m);init(n);
}
return 0;
}