#include #include #include #include #include #include using namespace std; const int maxn = 100010; typedef long long LL; int a[maxn], vidx[maxn]; int vis[maxn], flg[maxn]; namespace SegmentTree{ int maxv[maxn<<2]; int setv[maxn<<2]; #define Lson o<<1 #define Rson o<<1|1 void pushup(int o){ maxv[o] = max(maxv[Lson], maxv[Rson]); } void build(int o, int l, int r){ int m = (l+r)>>1; if(l == r){ maxv[o] = a[l]; setv[o] = -1; } else { build(Lson, l, m); build(Rson, m+1, r); setv[o] = -1; pushup(o); } } void pushdown(int o){ if (setv[o] >= 0){ setv[Lson] = setv[Rson] = setv[o]; maxv[Lson] = maxv[Rson] = setv[o]; setv[o] = -1; } } int v, ul, ur; void update(int o, int l, int r){ if(l > r) return ; if (ul <= l && r <= ur){ setv[o] = v; maxv[o] = v; } else{ pushdown(o); int m = (l+r)>>1; if (ul <= m) update(Lson, l, m); if (ur > m) update(Rson, m+1, r); pushup(o); } } int _max, ql, qr; void query(int o, int l, int r){ if(l>r) return ; if (setv[o] >= 0){ _max = max(_max, setv[o]); } else if (ql <= l && r <= qr){ _max = max(_max, maxv[o]); } else { int m = (l+r)>>1; pushdown(o); if(ql <= m) query(Lson, l, m); if(qr > m) query(Rson, m+1, r); } } } namespace BS{ typedef pair seg; #define l first #define r second #define MP make_pair int n; map mp; void init(){ mp.clear(); } void add(int l, int r){ seg line = MP(l, r); mp.insert(line); } int search(int v){ map::iterator it = mp.upper_bound(v); if (it == mp.begin()){ return 0; } else{ --it; return it->r; } } } int ans[maxn]; void link(int l, int r){ for(int i=l; i