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
| struct Node{ int ls,rs,mx,mi; }p[N]; int tot; inline LCT(){tot=0;} inline void ChangeMin(int &k,int l,int r,int z,int y,int id){ if(!k){k=++tot;assert(tot<=N-1);} if(l==r){if(!p[k].mi||F(p[k].mi,l)>F(id,l)) p[k].mi=id;return;}int mid=(l+r)>>1; if(z<=l&&r<=y){ if(!p[k].mi) p[k].mi=id; if(F(p[k].mi,mid)>F(id,mid)) swap(p[k].mi,id); (F(id,l)<F(p[k].mi,l))?ChangeMin(ls(k),l,mid,z,y,id):ChangeMin(rs(k),mid+1,r,z,y,id); return; } if(z<=mid) ChangeMin(ls(k),l,mid,z,y,id);if(mid<y) ChangeMin(rs(k),mid+1,r,z,y,id); } inline void ChangeMax(int &k,int l,int r,int z,int y,int id){ if(!k){k=++tot;} if(l==r){if(!p[k].mx||F(p[k].mx,l)<F(id,l)) p[k].mx=id;return;}int mid=(l+r)>>1; if(z<=l&&r<=y){ if(!p[k].mx) p[k].mx=id; if(F(p[k].mx,mid)<F(id,mid)) swap(p[k].mx,id); (F(id,l)>F(p[k].mx,l))?ChangeMax(ls(k),l,mid,z,y,id):ChangeMax(rs(k),mid+1,r,z,y,id); return; } if(z<=mid) ChangeMax(ls(k),l,mid,z,y,id);if(mid<y) ChangeMax(rs(k),mid+1,r,z,y,id); } inline void Change(int &k,int l,int r,int z,int y,int id){ ChangeMin(k,l,r,z,y,id);ChangeMax(k,l,r,z,y,id); } inline int AskMin(int k,int l,int r,int w){ if(!k) return 0;if(l==r) return p[k].mi; int mid=(l+r)>>1;int id=-1; if(w<=mid) id=AskMin(ls(k),l,mid,w);else id=AskMin(rs(k),mid+1,r,w); if(id==0) return p[k].mi; return (F(id,w)<F(p[k].mi,w))?id:p[k].mi; } inline int AskMax(int k,int l,int r,int w){ if(!k) return 0;if(l==r) return p[k].mx; int mid=(l+r)>>1;int id=-1; if(w<=mid) id=AskMax(ls(k),l,mid,w);else id=AskMax(rs(k),mid+1,r,w); if(id==0) return p[k].mx; return (F(id,w)>F(p[k].mx,w))?id:p[k].mx; } inline void Clear(){mset(p,0);rt=0;tot=0;}
|