分析:
每次两个数比较,大的留下,小的放后面,可以发现只要最大的到了第一位就只能是它赢,因此统计第一次遍历所有数组元素的赢的次数,如果查询是最大的数呢么就在加上k-n,赛时代码写的一团乱,看到别人简短的代码感觉很妙,直接简短记录每一个元素的次数,并且在查询的时候先用k将当前查询元素下标的前两位也就是i-2的元素数量减去,因为每一个元素只能是从他的前一个元素开始比较,k减去多余元素,然后将最大值的次数设置为无穷大,那么可以对任意i数都通过次数和k取最小值来得到最终答案,因为所有数的次数都只有前n轮有机会赢吃了最大的,因此都不会大于k,只有最大的时候,取减去前面无用的元素数量后恰好就是最大值k轮赢的次数。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int _;
cin>>_;
while(_--)
{
int n,q;
cin>>n>>q;
vector<int> a(n+1);
map<int,int> m;
for(int i=1;i<=n;i++) cin>>a[i];
int x=1;
for(int i=2;i<=n;i++)
{
if(a[i]>a[x]) x=i;
m[x]++;
}
m[x]=0x3f3f3f3f;
while(q--)
{
int i;
ll k;
cin>>i>>k;
k-=max(i-2,0);
cout<<max((ll)0,min(k,(ll)m[i]))<<'\n';
}
}
}