给n个点,m个询问l,r,问可以将l,r分成几组使得value最大
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <climits> //INT_MAX
using namespace std;
typedef long long ll;
const int M=200000+5;
int a[M],vis[M],ans,ret[M];
struct node
{
int id,l,r,pos;
}v[M];
int cmp(node x,node y)
{
if(x.pos<y.pos)//这边排序是pos,即组优先,相等再按右界排序
return 1;
else if(x.pos==y.pos&&x.r<y.r)
return 1;
return 0;
}
inline void insert(int x)
{
x=a[x];
vis[x]=1;///除此之外还有别的情况,(这错了,搞了2个小时,草)
if(vis[x-1]&&vis[x+1]){//必须同时满足
ans--;
}
else if(!vis[x-1]&&!vis[x+1]){
ans++;
}
}
inline void erase(int x)
{
x=a[x];
vis[x]=0;
if(vis[x-1]&&vis[x+1]){
ans++;
}
else if(!vis[x-1]&&!vis[x+1]){
ans--;
}
}
int main()
{
int t,n,m,i,j,k;
int l,r;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
int x=sqrt(n);
for(i=1;i<=m;i++){
scanf("%d%d",&v[i].l,&v[i].r);
v[i].id=i;
v[i].pos=v[i].l/x;
}
sort(v+1,v+m+1,cmp);
memset(vis,0,sizeof(vis));
ans=0;
insert(1);
int p=1,q=1;
for(i=1;i<=m;i++){
l=v[i].l;
r=v[i].r;
while (q<r) insert(++q);
while (q>r) erase(q--);
while (p<l) erase(p++);
while (p>l) insert(--p);
ret[v[i].id]=ans;
}
for(i=1;i<=m;i++)
printf("%d\n",ret[i]);
}
return 0;
}