显示代码纯文本
- #include<bits/stdc++.h>
- using namespace std;
- const int N=2e5+5;
- const int S=450;
- int n,Q,a[N],ans[N];
- int L[N],R[N],pre[N];
- struct qnode{
- int l,r,x,q;
- }que[N];
- bool cmp(qnode a,qnode b){
- if(a.x==b.x)return a.r<b.r;
- return a.x<b.x;
- }
- int t[N];
- void pushup(int p){
- t[p]=min(t[p<<1],t[p<<1|1]);
- }
- void build(int p,int l,int r){
- if(l==r){
- t[p]=a[l];
- return;
- }
- int mid=(l+r)>>1;
- build(p<<1,l,mid);
- build(p<<1|1,mid+1,r);
- pushup(p);
- }
- int query(int p,int l,int r,int L,int R){
- if(L>R)return -1;
- if(L<=l&&r<=R){
- return t[p];
- }
- int mid=(l+r)>>1;
- if(R<=mid) return query(p<<1,l,mid,L,R);
- if(L>mid) return query(p<<1|1,mid+1,r,L,R);
- return min(query(p<<1,l,mid,L,R),query(p<<1|1,mid+1,r,L,R));
- }
- int main(){
- freopen("dry.in","r",stdin);
- freopen("dry.out","w",stdout);
- std::cin>>n>>Q;
- for(int i=1;i<=n;i++) std::cin>>a[i];
- build(1,1,n);
- memset(pre,0,sizeof(pre));
- for(int i=1;i<=n;i++){
- if(pre[a[i]]) L[i]=(query(1,1,n,pre[a[i]],i)<a[i]?-1:pre[a[i]]);
- else L[i]=-1;pre[a[i]]=i;
- }
- memset(pre,0,sizeof(pre));
- for(int i=n;i;i--){
- if(pre[a[i]]) R[i]=(query(1,1,n,i,pre[a[i]])<a[i]?n+5:pre[a[i]]);
- else R[i]=n+5;pre[a[i]]=i;
- }
- for(int i=1;i<=Q;i++){
- int l,r;
- std::cin>>l>>r;
- que[i]=(qnode){l,r,l/S+1,i};
- }
- sort(que+1,que+Q+1,cmp);
- int l=1,r=0,res=0;
- for(int i=1;i<=Q;i++){
- int ql=que[i].l,qr=que[i].r;
- while(l>ql){
- l--;
- res+=R[l]>r;
- }
- while(r<qr){
- r++;
- res+=L[r]<l;
- }
- while(l<ql){
- res-=R[l]>r;
- l++;
- }
- while(r>qr){
- res-=L[r]<l;
- r--;
- }
- ans[que[i].q]=res;
- }
- for(int i=1;i<=Q;i++) std::cout<<ans[i]<<endl;
- return 0;
- }