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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <bits/stdc++.h> using namespace std; const int N=400010; int ans[N],n,m,L[N],R[N],am[N],ss,c[N],p[N],np[N],R2[N],len[N]; struct node{int x,y;}q[N]; int get(int x){return lower_bound(am+1,am+1+ss,x)-am;} int nn; void clear(int n){nn=n;for(int i=1;i<=n;i++)c[i]=0;} void add(int x,int y){for(int i=x;i<=nn;i+=(i&-i))c[i]+=y;} int query(int x){int cnt=0;for(int i=x;i>=1;i-=(i&-i))cnt+=c[i];return cnt;} int query(int l,int r){return l>r?0:query(r)-query(l-1);} vector<node>v[N],V[N]; set<int>S; using pii=pair<int,int>; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d%d",L+i,R+i),am[++ss]=L[i],am[++ss]=R[i],len[i]=R[i]-L[i]; sort(am+1,am+1+ss);ss=unique(am+1,am+1+ss)-am-1; for(int i=1;i<=n;i++)L[i]=get(L[i]),R[i]=get(R[i]); scanf("%d",&m); for(int i=1;i<=m;i++)scanf("%d%d",&q[i].x,&q[i].y); for(int i=1;i<=n;i++)p[i]=i; sort(p+1,p+1+n,[](int x,int y){return L[x]==L[y]?R[x]<R[y]:L[x]<L[y];}); for(int i=1;i<=n;i++)np[p[i]]=i; for(int i=1;i<=m;i++)if(len[q[i].x]>=q[i].y) V[np[q[i].x]-1].push_back({get(am[L[q[i].x]]+q[i].y),i}); for(int i=1;i<=n;i++)v[np[i]].push_back({R[i],1}); clear(ss); for(int i=1;i<=n;i++){ for(node j:v[i])add(j.x,j.y); for(node j:V[i])ans[j.y]+=query(j.x,ss); } priority_queue<pii,vector<pii>,greater<pii>>q1,q2; R2[1]=-1; for(int i=1;i<n;i++)R2[i+1]=max(R2[i],R[p[i]]); for(int i=1;i<=n;i++){ q1.push({am[R[i]]-am[L[i]],np[i]}); q2.push({am[R2[np[i]]]-am[L[i]],np[i]}); } ss=0; for(int i=1;i<=m;i++)am[++ss]=q[i].y; sort(am+1,am+1+ss);ss=unique(am+1,am+1+ss)-am-1; for(int i=1;i<=ss;i++)v[i].clear(); for(int i=1;i<=m;i++)if(len[q[i].x]>=q[i].y) v[get(q[i].y)].push_back({q[i].x,i}); S.insert(n+1); clear(n); for(int i=1;i<=n;i++)add(i,1); for(int i=1;i<=ss;i++){ while(!q1.empty()){ pii t=q1.top(); int x=t.second,y=t.first; if(y>=am[i])break; q1.pop(); add(x,-1); } while(!q2.empty()){ pii t=q2.top(); int x=t.second,y=t.first; if(y>=am[i])break; q2.pop(); S.insert(x); } for(node j:v[i]){ int x=j.x,id=j.y; int t=*S.upper_bound(np[x]); ans[id]+=query(np[x]+1,t-1); } } for(int i=1;i<=m;i++)ans[i]++; for(int i=1;i<=m;i++)printf("%d\n",ans[i]); return 0; }
|