1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include<bits/stdc++.h> #define inl inline using namespace std; const int N=2e5+5; struct TR {int c,a; }tr[N*4]; int n,m,d,ma[N],a[N],b[N],po[N],f[N],fa[N][18]; inl int Read() { int s=0; char c; while(!isdigit(c=getchar())); for(;isdigit(c);c=getchar()) s=s*10+c-'0'; return s; } #define L (p<<1) #define R (L|1) #define md ((l+r)>>1) inl void BD(int p,int l,int r) {if(l==r) return po[l]=p, void(); BD(L,l,md); BD(R,md+1,r); } inl void AD(int t) {for(int p=po[t];p;p>>=1) ++tr[p].c, !tr[p].a&&(tr[p].a=t); } inl int QR(int p,int l,int r,int ra,int &k) { if(l>ra) return 0; if(r<=ra&&tr[p].c<k) return k-=tr[p].c, 0; if(l==r) return l; int t=QR(R,md+1,r,ra,k); return t?t:QR(L,l,md,ra,k); } inl int QA(int p,int l,int r,int la,int ra) { if(l>ra||r<la) return 0; if(l>=la&&r<=ra) return tr[p].a; int x=QA(L,l,md,la,ra),y=QA(R,md+1,r,la,ra); return a[x]>a[y]?x:y; } #undef L #undef R #undef md int main() { freopen("firebig.in","r",stdin); freopen("firebig.out","w",stdout); n=Read(); m=Read(); d=Read(); for(int i=1;i<=n;++i) ++b[a[i]=Read()]; for(int i=1;i<N;++i) b[i]+=b[i-1]; for(int i=n;i>=1;--i) a[i]=b[a[i]]--; for(int i=1;i<=n;++i) b[i]=i; sort(b+1,b+n+1,[](int x,int y){return a[x]>a[y]; }); BD(1,1,n); for(int i=1,p,k;i<=n;++i) { p=b[i]; k=d; f[p]=QR(1,1,n,p,k); fa[p][0]=QA(1,1,n,f[p],p); AD(p); for(int j=1;j<18;++j) fa[p][j]=fa[fa[p][j-1]][j-1]; } while(m--) { int l=Read(),r=Read(),an=1; if(l==r) {puts("0"); continue; } for(int i=17;~i;--i) f[fa[r][i]]>l&&(an+=1<<i,r=fa[r][i]); printf("%d\n",an+(f[r]>l)); } return 0; }
|