标题L - Timsort Gym
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn=1e5+5;
struct node
{
int v1=0,v2=0;
}ans[maxn];
int a[maxn];
int c1[maxn],c2[maxn],c[maxn];
int n,q;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int pre=1;
a[0]=a[1],a[n+1]=a[n]-1;
for(int i=1;i<=n+1;i++)
{
if(a[i]>=a[i-1])
continue;
for(int j=pre;j<=i-1;j++)
c1[j]=i-1-j;
pre=i;
}
pre=n;
for(int i=n;i>=0;i--)
{
if(a[i]>a[i+1])
continue;
for(int j=pre;j>=i+1;j--)
c2[j]=pre-j;
pre=i;
}
for(int i=1;i<=n;i++)
c[i]=max(c1[i],c2[i]);
scanf("%d",&q);
int dis;
int tmp1,tmp2;
while(q--)
{
scanf("%d",&dis);
if(ans[dis].v1!=0)
printf("%d %d\n",ans[dis].v1,ans[dis].v2);
else
{
int i=1,times=0;
while(i<=n)
{
ans[dis].v1++;
tmp1=i+c[i]+1;
tmp2=i+dis;
tmp2=min(tmp2,n+1);
if(tmp1>=tmp2)
i=tmp1;
else
ans[dis].v2+=(tmp2-i-c[i]-1),i=tmp2;
}
printf("%d %d\n",ans[dis].v1,ans[dis].v2);
}
}
return 0;
}