显示代码纯文本
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+10;
int pre[N];
struct node{
int a,b,id;
}qa[N];
bool cmp(node a,node b){
return a.b<b.b;
}
int n,q,t[N],res[N],s[N];
int x[N*4];//?????????
void build(int u,int l,int r){
if(l==r){
x[u]=s[l];
return ;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
x[u]=min(x[u*2],x[u*2+1]);
return ;
}
int g_min(int u,int l,int r,int ql,int qr){
if(l==ql&&r==qr){
return x[u];
}
int mid=(l+r)/2;
if(qr<=mid)return g_min(u*2,l,mid,ql,qr);
if(ql>mid)return g_min(u*2+1,mid+1,r,ql,qr);
return min(g_min(u*2,l,mid,ql,mid),g_min(u*2+1,mid+1,r,mid+1,qr));
}
int sm[N*4];
void push_down(int p){
sm[p*2]+=sm[p];
sm[p*2+1]+=sm[p];
sm[p]=0;
return;
}
void insert(int p,int l,int r,int ql,int qr){
if(l==ql&&r==qr){
sm[p]++;
return;
}
int mid=(l+r)>>1;
if(qr<=mid)insert(p*2,l,mid,ql,qr);
else if(ql>mid)insert(p*2+1,mid+1,r,ql,qr);
else insert(p*2,l,mid,ql,mid),insert(p*2+1,mid+1,r,mid+1,qr);
}
int getans(int p,int l,int r,int q){
if(l==r)return sm[p];
push_down(p);
int mid=(l+r)>>1;
if(q<=mid)return getans(p*2,l,mid,q);
return getans(p*2+1,mid+1,r,q);
}
signed main(){
freopen("dry.in","r",stdin);
freopen("dry.out","w",stdout);
scanf("%lld%lld",&n,&q);
for(int i=1;i<=n;i++){
scanf("%lld",&s[i]);
}
build(1,1,n);
for(int i=1;i<=q;i++){
scanf("%lld%lld",&qa[i].a,&qa[i].b);
qa[i].id=i;
}
sort(qa+1,qa+1+q,cmp);
for(int i=1;i<=n;i++)pre[i]=t[s[i]],t[s[i]]=i;
int now=1;
// return 0;
for(int i=1;i<=n;i++){
if(s[i]<=g_min(1,1,n,pre[i]+1,i)){
insert(1,1,n,pre[i]+1,i);
}else{
insert(1,1,n,1,i);
}
while(now<=q&&qa[now].b==i){
res[qa[now].id]=getans(1,1,n,qa[now].a);
now++;
}
}
for(int i=1;i<=q;i++){
printf("%lld\n",res[i]);
}
return 0;
}