解题思路
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<set>
#define ll long long
#define ldb long double
#define pii pair <int,int>
using namespace std;
vector <pii> e[200010];
int n,q,l,r,a[400010][20],pre[200010],ls[200010],tree[200010],ans[200010];
void add(int x,int v){
for(int i=x;i<=n;i+=i&(-i))
tree[i]+=v;
}
int find(int x){
int s=0;
for(int i=x;i;i-=i&(-i))
s+=tree[i];
return s;
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i][0]);
pre[i]=ls[a[i][0]];
ls[a[i][0]]=i;
}
for(int j=1;j<=18;j++)
for(int i=1;i<=n;i++)
a[i][j]=min(a[i][j-1],a[i+(1<<(j-1))][j-1]);
for(int i=1;i<=q;i++)
{
scanf("%d%d",&l,&r);
e[r].push_back((pii){i,l});
}
for(int i=1;i<=n;i++)
{
int p=pre[i],d=log2(i-p);
if(min(a[p+1][d],a[p+(1<<d)][d])<a[i][0])
add(1,1);
else add(p+1,1);
add(i+1,-1);
for(pii it:e[i])ans[it.first]=find(it.second);
}
for(int i=1;i<=q;i++)
printf("%d\n",ans[i]);
}