注意:这个题中得注意先要移动右指针在移动左指针。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct note
{
int id,l,r,ans;
} q[maxn];
int block[maxn];
int mp[maxn];
int num[maxn];
int cmp1(note a,note b)
{
if(block[a.l]<block[b.l]) return 1;
if(block[a.l]>block[b.l]) return 0;
return a.r<b.r;
}
int cmp2(note a,note b)
{
return a.id<b.id;
}
int last_l,last_r;
int main()
{
int t;
scanf("%d",&t);
for(int it=1; it<=t; it++)
{
last_l=1;
last_r=0;
memset(mp,0,sizeof(mp));
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%d",&num[i]);
for(int i=1; i<=m; i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
block[0]=(int)sqrt(n);
for(int i=1; i<=n; ++i)
block[i]=i/block[0]+1;
int sum=0;
sort(q+1,q+1+n,cmp1);
for(int i=1; i<=m; i++)
{
if(last_r<q[i].r)
{
for(int j=last_r+1; j<=q[i].r; j++)
{
sum++;
mp[num[j]]=1;
if(mp[num[j]+1])
sum--;
if(mp[num[j]-1])
sum--;
}
}
if(last_r>q[i].r)
{
for(int j=q[i].r+1; j<=last_r; j++)
{
sum--;
mp[num[j]]=0;
if(mp[num[j]+1])
sum++;
if(mp[num[j]-1])
sum++;
}
}
if(last_l<q[i].l)
{
for(int j=last_l; j<=q[i].l-1; j++)
{
sum--;
mp[num[j]]=0;
if(mp[num[j]+1])
sum++;
if(mp[num[j]-1])
sum++;
}
}
if(last_l>q[i].l)
{
for(int j=q[i].l; j<=last_l-1; j++)
{
sum++;
mp[num[j]]=1;
if(mp[num[j]+1])
sum--;
if(mp[num[j]-1])
sum--;
}
}
last_l=q[i].l;
last_r=q[i].r;
q[i].ans=sum;
}
sort(q+1,q+1+n,cmp2);
for(int i=1; i<=m; i++)
printf("%d
",q[i].ans);
}
}