code:
#include<bits/stdc++.h>
#define ls (p<<1)
#define rs (p<<1|1)
using namespace std;
struct node{
int lsum,rsum,sum,S;
}tree[800010];
vector<pair<int,int> >g[200010];
int b[6000010];
unordered_map<int,int>lsh;
struct NN{
int l,r,id;
}Q[400010];
int Len;
bool cmp(NN i,NN j){
int ksi=(i.l-1)/Len+1;
int ksj=(j.l-1)/Len+1;
if(ksi!=ksj)return ksi<ksj;
return i.r<j.r;
}
int ll[200010],rr[200010];
void pushup(int p,int l,int r){
int mid=(l+r)>>1;
tree[p].S=tree[ls].S+tree[rs].S;
tree[p].lsum=tree[ls].lsum;
if(tree[p].lsum==mid-l+1)tree[p].lsum+=tree[rs].lsum;
tree[p].rsum=tree[rs].rsum;
if(tree[p].rsum==r-mid)tree[p].rsum+=tree[ls].rsum;
tree[p].sum=max(max(tree[ls].sum,tree[rs].sum),tree[ls].rsum+tree[rs].lsum);
}
void change(int p,int l,int r,int x,int y){
if(l>x||r<x)return;
if(l==r&&l==x){
tree[p].lsum=tree[p].rsum=tree[p].sum=tree[p].S=y;
return;
}
int mid=(l+r)>>1;
change(ls,l,mid,x,y);
change(rs,mid+1,r,x,y);
pushup(p,l,r);
}
node ask(int p,int l,int r,int L,int R){
if(l>R||r<L)return (node){0,0,0,0};
if(l>=L&&r<=R)return tree[p];
int mid=(l+r)>>1;
node I=ask(ls,l,mid,L,R);
node J=ask(rs,mid+1,r,L,R);
node K;
K.S=I.S+J.S;
K.lsum=I.lsum;
if(K.lsum==mid-l+1)K.lsum+=J.lsum;
K.rsum=J.rsum;
if(K.rsum==r-mid)K.rsum+=I.rsum;
K.sum=max(max(I.sum,J.sum),I.rsum+J.lsum);
return K;
}
int n,m;
void add(int x,int y){
for(auto pp:g[x]){
if(pp.second!=y)change(1,1,n,pp.first,1);
}
}
void del(int x,int y){
for(auto pp:g[x]){
if(pp.second!=y)change(1,1,n,pp.first,0);
}
}
int ans[200010];
int main(){
cin>>n>>m;
int cnt=0;
for(int i=1;i<=n;i++){
cin>>ll[i]>>rr[i];
b[++cnt]=ll[i];
b[++cnt]=rr[i];
}
for(int i=1;i<=m;i++){
cin>>Q[i].l>>Q[i].r;
Q[i].id=i;
b[++cnt]=Q[i].l;
b[++cnt]=Q[i].r;
}
sort(b+1,b+cnt+1);
int len=unique(b+1,b+cnt+1)-b-1;
Len=2*sqrt(len);
for(int i=1;i<=len;i++)lsh[b[i]]=i;
for(int i=1;i<=n;i++)ll[i]=lsh[ll[i]],rr[i]=lsh[rr[i]];
for(int i=1;i<=m;i++)Q[i].l=lsh[Q[i].l],Q[i].r=lsh[Q[i].r];
for(int i=1;i<=n;i++)g[ll[i]].push_back(make_pair(i,0)),g[rr[i]].push_back(make_pair(i,1));
sort(Q+1,Q+m+1,cmp);
int L=1,R=0;
for(int i=1;i<=m;i++){
while(R<Q[i].r)R++,add(R,1);
while(L<Q[i].l)del(L,0),L++;
while(L>Q[i].l)L--,add(L,0);
while(R>Q[i].r)del(R,1),R--;
ans[Q[i].id]=ask(1,1,n,1,n).sum;
}
for(int i=1;i<=m;i++)cout<<ans[i]<<"\n";
return 0;
}