#include #include #include #include #include #include #include #include #include #include #define inf 1<<28 #define M 6000005 #define N 11005 #define maxn 300005 #define Min(a,b) ((a)<(b)?(a):(b)) #define Max(a,b) ((a)>(b)?(a):(b)) #define pb(a) push_back(a) #define mem(a,b) memset(a,b,sizeof(a)) #define LL long long #define MOD 1000000007 #define lson step<<1 #define rson step<<1|1 using namespace std; struct segment{ int x1,x2,y,val; segment(){} segment(int _x1,int _x2,int _y,int _v):x1(_x1),x2(_x2),y(_y),val(_v){} bool operator<(const segment s)const{ return y>1; Bulid(lson,l,m); Bulid(rson,m+1,r); } void Push_Up(int step){ int state=(L[step].cnt[1]>0?1:0)|(L[step].cnt[2]>0?2:0)|(L[step].cnt[4]>0?4:0); if(state){ mem(L[step].len,0); L[step].len[state]=x[L[step].right+1]-x[L[step].left]; for(int i=1;i<8;i++){ if(state!=(state|i)){ int tmp=L[lson].len[i]+L[rson].len[i]; L[step].len[state|i]+=tmp; L[step].len[state]-=tmp; } } } else if(L[step].left!=L[step].right) for(int i=1;i<8;i++) L[step].len[i]=L[lson].len[i]+L[rson].len[i]; else mem(L[step].len,0); } void Update(int step,int l,int r,int val){ if(L[step].left==l&&r==L[step].right) val>0?++L[step].cnt[val]:--L[step].cnt[-val]; else{ int m=(L[step].left+L[step].right)>>1; if(r<=m) Update(lson,l,r,val); else if(l>m) Update(rson,l,r,val); else{ Update(lson,l,m,val); Update(rson,m+1,r,val); } } Push_Up(step); } int Bin(int m){ int low=1,high=cnt,mid; while(low<=high){ mid=(low+high)>>1; if(x[mid]==m) return mid; if(x[mid]