按纵坐标从小到大顺序加入每个栅栏,用线段树维护从每个横坐标,纵坐标正无穷处走到0,0的答案,加入一个栅栏,一定是这段区间左边一段往左走,右边一段往右走,分界点可以算出来,两边都分别相当于给答案进行区间赋值再区间加等差数列,线段树搞就行了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<queue>
#include<stack>
using namespace std;
#define MAXN 200010
#define MAXM 1010
#define INF 1000000000
#define MOD 1000000007
#define eps 1e-8
#define ll long long
int L=100000;
int sc[MAXN<<2],gc[MAXN<<2],v[MAXN<<2],ch[MAXN<<2];
inline void toch(int x,int y){
sc[x]=gc[x]=0;
v[x]=ch[x]=y;
}
inline void toadd(int x,int y,int z){
sc[x]+=y;
gc[x]+=z;
}
inline void pd(int x,int y,int z){
if(ch[x]!=-1){
toch(x<<1,ch[x]);
toch(x<<1|1,ch[x]);
ch[x]=-1;
}
int mid=y+z>>1;
toadd(x<<1,sc[x],gc[x]);
toadd(x<<1|1,sc[x]+(mid+1-y)*gc[x],gc[x]);
sc[x]=0;
gc[x]=0;
}
void change(int x,int y,int z,int l,int r,int cv){
if(y==l&&z==r){
toch(x,cv);
return ;
}
pd(x,y,z);
int mid=y+z>>1;
if(r<=mid){
change(x<<1,y,mid,l,r,cv);
}else if(l>mid){
change(x<<1|1,mid+1,z,l,r,cv);
}else{
change(x<<1,y,mid,l,mid,cv);
change(x<<1|1,mid+1,z,mid+1,r,cv);
}
}
void add(int x,int y,int z,int l,int r,int as,int ac){
if(y==l&&z==r){
toadd(x,as,ac);
return ;
}
pd(x,y,z);
int mid=y+z>>1;
if(r<=mid){
add(x<<1,y,mid,l,r,as,ac);
}else if(l>mid){
add(x<<1|1,mid+1,z,l,r,as,ac);
}else{
add(x<<1,y,mid,l,mid,as,ac);
add(x<<1|1,mid+1,z,mid+1,r,as+(mid-l+1)*ac,ac);
}
}
int ask(int x,int y,int z,int p){
if(y==z){
return v[x]+sc[x];
}
pd(x,y,z);
int mid=y+z>>1;
if(p<=mid){
return ask(x<<1,y,mid,p);
}else if(p>mid){
return ask(x<<1|1,mid+1,z,p);
}
}
int n,s;
int main(){
int i,x,y;
memset(ch,-1,sizeof(-1));
scanf("%d%d",&n,&s);
add(1,-L,L,-L,0,L,-1);
add(1,-L,L,0,L,0,1);
for(i=1;i<=n;i++){
scanf("%d%d",&x,&y);
int xx=ask(1,-L,L,x);
int yy=ask(1,-L,L,y);
int p=(yy-xx+x+y)/2;
if(p>=x){
p=min(p,y);
change(1,-L,L,x,p,xx);
add(1,-L,L,x,p,0,1);
}
p++;
if(p<=y){
p=max(p,x);
change(1,-L,L,p,y,yy);
add(1,-L,L,p,y,y-p,-1);
}
}
printf("%d\n",ask(1,-L,L,s));
return 0;
}
/*
*/