/** 静态凸包(with. std::complex)
* 2022-02-04: https://loj.ac/s/1370861
**/usingPoint=std::complex<i64>;#define x real
#define y imag
autodot(constPoint&a,constPoint&b){return(std::conj(a)*b).x();}autocross(constPoint&a,constPoint&b){return(std::conj(a)*b).y();}autorot(constPoint&p){returnPoint(-p.y(),p.x());}autocomplexHull(std::vector<Point>a){std::sort(a.begin(),a.end(),[&](autoa,autob){if(a.x()!=b.x()){returna.x()<b.x();}else{returna.y()<b.y();}});std::vector<Point>l,h;for(autop:a){while(l.size()>1&&cross(l.back()-l[l.size()-2],p-l.back())<=0){l.pop_back();}while(h.size()>1&&cross(h.back()-h[h.size()-2],p-h.back())>=0){h.pop_back();}l.push_back(p);h.push_back(p);}std::reverse(h.begin(),h.end());h.insert(h.end(),l.begin()+1,l.end()-1);returnh;}intsgn(Pointp){if(p.y()>0||(p.y()==0&&p.x()<0)){return0;}else{return1;}}
#line 1 "src/jiangly/math/11C-Convex-Hull.hpp"
/** 静态凸包(with. std::complex)
* 2022-02-04: https://loj.ac/s/1370861
**/usingPoint=std::complex<i64>;#define x real
#define y imag
autodot(constPoint&a,constPoint&b){return(std::conj(a)*b).x();}autocross(constPoint&a,constPoint&b){return(std::conj(a)*b).y();}autorot(constPoint&p){returnPoint(-p.y(),p.x());}autocomplexHull(std::vector<Point>a){std::sort(a.begin(),a.end(),[&](autoa,autob){if(a.x()!=b.x()){returna.x()<b.x();}else{returna.y()<b.y();}});std::vector<Point>l,h;for(autop:a){while(l.size()>1&&cross(l.back()-l[l.size()-2],p-l.back())<=0){l.pop_back();}while(h.size()>1&&cross(h.back()-h[h.size()-2],p-h.back())>=0){h.pop_back();}l.push_back(p);h.push_back(p);}std::reverse(h.begin(),h.end());h.insert(h.end(),l.begin()+1,l.end()-1);returnh;}intsgn(Pointp){if(p.y()>0||(p.y()==0&&p.x()<0)){return0;}else{return1;}}