当时只差临门一脚,多了许多罚时,贴个代码警示一下;
#include<bits/stdc++.h>
#define MAXN 100000
using namespace std;
int s[100005],a[100005],b[100005],c[100005];
int lis[100005];
struct node {
int x,y,id;
bool operator<(const node &z)const {
return x>z.x;
}
} xt[100005];
int sum[100005];
int main() {
int t;
scanf("%d",&t);
while(t--) {
int n,m;
memset(s,0,sizeof(s));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
//memset(lis,0,sizeof(lis));
scanf("%d%d",&n,&m);
int maxn=0;
for(int i=1; i<=n; i++) {
scanf("%d",&s[i]);
if(s[i]>maxn) {
maxn=s[i];
a[i]=a[i-1]+1;
c[i]=maxn;
} else
a[i]=a[i-1],c[i]=maxn;
}
for(int i=0; i<m; i++) {
int a,b;
scanf("%d%d",&a,&b);
xt[i].x=a,xt[i].y=b;
xt[i].id=i;
}
sort(xt,xt+m);
int head=MAXN,tail=MAXN;
lis[MAXN]=s[n],maxn=n;
for(int i=0; i<m; i++) {
int p=xt[i].x,q=xt[i].y,id=xt[i].id;
for(int j=maxn; j>=p+1; j--) {
while(head>=tail&&lis[tail]<=s[j])
tail++;
lis[--tail]=s[j];
}
maxn=p;
if(c[p-1]>=q) {
int j=upper_bound(lis+tail,lis+head+1,c[p-1])-lis;
sum[id]=a[p-1]+head-j+1;
} else {
int j=upper_bound(lis+tail,lis+head+1,q)-lis;
sum[id]=a[p-1]+head-j+2;
}
}
for(int i=0; i<m; i++) {
printf("%d\n",sum[i]);
}
}
return 0;
}