RT,看了看,自己写的RMQ的模板没问题啊,手测的几组样例也没问题,但就是WA了qaq
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const LL maxlog=24;
const LL maxn=1e5+1e2;
struct RMQ{
LL d[maxn][maxlog],len;
void init(const vector<LL>& A)
{
LL n=A.size();
for(LL i=0;i<n;i++)d[i+1][0]=A[i];
for(LL j=1;(1<<j)<=n;j++)
for(LL i=1;i+(1<<j)-1<=n;i++)
d[i][j]=max(d[i][j-1],d[i+(1<<j)-1][j-1]);
len=n;
}
LL query(LL l,LL r)
{
LL k=0;
while((1<<(k+1))<=r-l+1)k++;
// printf("%lld %lld\n",l,r);
// for(LL i=1;i<=len;i++)printf("%lld ",d[i][0]);
// printf("\n");
return max(d[l][k],d[r-(1<<k)+1][k]);
}
};
RMQ rmq;
LL l[maxn],r[maxn],num[maxn],a[maxn];
int main()
{
LL n,q,i,j,left,right;
while(1)
{
scanf("%lld",&n);
if(n==0)return 0;
scanf("%lld",&q);
for(i=1;i<=n;i++) scanf("%lld",&a[i]);
LL start=1,k=0;
vector<LL> cnt;
a[n+1]=a[n]+1;
for(i=2;i<=n+1;i++)
{
if(a[i-1]<a[i])
{
cnt.push_back(i-start);
++k;
for(j=start;j<i;j++)
{
l[j]=start;
r[j]=i-1;
num[j]=k;
}
start=i;
}
}
rmq.init(cnt);
LL ans=0;
for(i=1;i<=q;i++)
{
scanf("%lld %lld",&left,&right);
if(num[left]==num[right])
{
printf("%lld\n",right-left+1);
}
else {
if(num[left]==num[right]-1)
{
printf("%lld\n",max((r[left]-left+1),(right-l[right]+1)));
}
if(num[left]+1<=num[right]-1)
{
ans=max((r[left]-left+1),(right-l[right]+1));
ans=max(ans,rmq.query(num[left]+1,num[right]-1));
printf("%lld\n",ans);
}
}
}
}
return 0;
}