query



图片说明





  • #include<bits/stdc++.h>
    using namespace std;
    const int N=2e6+5;
    int n,m=0,q,ans[N],pos[N];
    struct node{
      int x,y,id;
      bool friend operator<(node l,node r){
          return l.y<r.y;
      }
    }qx[N],qy[N];
    int sum[N]={0};
    void up(int x){for(int i=x;i<=n;i+=i&-i)sum[i]++;}
    int Q(int x){
      int res=0;
      for(int i=x;i;i&=i-1)res+=sum[i];
      return res;
    }
    int main(){
      scanf("%d%d",&n,&q);
      for(int i=1,x;i<=n;i++)scanf("%d",&x),pos[x]=i;
      for(int i=1;i<=n;i++)
      for(int j=2*i;j<=n;j+=i){
          if(pos[j]>pos[i])qx[++m]={pos[i],pos[j],0};
          else qx[++m]={pos[j],pos[i],0};
      }
      for(int i=1;i<=q;i++){
          scanf("%d%d",&qy[i].x,&qy[i].y);
          qy[i].id=i;
      }
      sort(qx+1,qx+1+m);sort(qy+1,qy+1+q);
      int cnt=1;
      for(int i=1;i<=q;i++){
          while(cnt<=m&&qx[cnt].y<=qy[i].y){
              up(qx[cnt].x);
              cnt++;
          }
          ans[qy[i].id]=Q(qy[i].y)-Q(qy[i].x-1);
      }
      for(int i=1;i<=q;i++)printf("%d\n",ans[i]);
    }




  • #include<bits/stdc++.h>
    using namespace std;
    const int N=2e6+5;
    int n,m=0,q;
    int pos[N],ans[N];
    struct qin_peng{
      int id,x,y,val,flag;
      bool friend operator<(qin_peng a,qin_peng b){
          return a.x<b.x;
      }
    }QR[N],QP[N];
    int sum[N]={0};
    void up(int x,int val){for(int i=x;i<N;i+=i&(-i))sum[i]+=val;}
    int Q(int x){
      int ans=0;
      for(int i=x;i;i&=i-1)ans+=sum[i];
      return ans;
    }
    int main(){
      scanf("%d%d",&n,&q);
      for(int i=1,x;i<=n;i++){
          scanf("%d",&x);
          pos[x]=i;
      }
      for(int i=1;i<=n;i++){
          for(int j=2*i;j<=n;j+=i){
              if(pos[j]>pos[i]){
                  QP[++m]={m,pos[i],pos[j],1,0};
              }
              else QP[++m]={m,pos[j],pos[i],1,0};
          }
      }
      int cnt=0;
      for(int i=1;i<=q;i++){
          int l,r;
          scanf("%d%d",&l,&r);
          int x1=l,y1=l,x2=r,y2=r;
          QR[++cnt]={i,x2,y2,0,1};
          QR[++cnt]={i,x1-1,y2,0,-1};
          QR[++cnt]={i,x2,y1-1,0,-1};
          QR[++cnt]={i,x1-1,y1-1,0,1};
      }
      sort(QP+1,QP+1+m);sort(QR+1,QR+1+cnt);
      int ptr=1;
      for(int i=1;i<=cnt;i++){
          while(ptr<=m&&QP[ptr].x<=QR[i].x){
              up(QP[ptr].y,QP[ptr].val);
              ++ptr;
          }
          ans[QR[i].id]+=QR[i].flag*Q(QR[i].y);
      }
      for(int i=1;i<=q;i++)printf("%d\n",ans[i]);
    }