#pragma once
template<typenameT>structYX{Ty,x;YX()=default;YX(Ty,Tx):y(y),x(x){}YX(conststd::pair<T,T>&yx):y(yx.first),x(yx.second){}YXoperator+()const{return*this;}YXoperator-()const{returnYX(-y,-x);}YX&operator++(){y++;x++;return*this;}YX&operator--(){y--;x--;return*this;}YX&operator++(int){YXa=*this;++*this;returna;}YX&operator--(int){YXa=*this;--*this;returna;}YX&operator+=(constYX&v){y+=v.y;x+=v.x;return*this;}YX&operator-=(constYX&v){y-=v.y;x-=v.x;return*this;}YX&operator*=(constT&a){y*=a;x*=a;return*this;}YX&operator/=(constT&a){y/=a;x/=a;return*this;}friendYXoperator+(constYX&u,constYX&v){returnYX(u)+=v;}friendYXoperator-(constYX&u,constYX&v){returnYX(u)-=v;}friendYXoperator*(constYX&u,constT&a){returnYX(u)*=a;}friendYXoperator*(constT&a,constYX&u){returnYX(u)*=a;}friendYXoperator/(constYX&u,constT&a){returnYX(u)/=a;}booloperator<(constYX&v)const{returny!=v.y?y<v.y:x<v.x;}booloperator>(constYX&v)const{returny!=v.y?y>v.y:x>v.x;}booloperator==(constYX&v)const{returny==v.yandx==v.x;}booloperator<=(constYX&v)const{return!(*this>v);}booloperator>=(constYX&v)const{return!(*this<v);}booloperator!=(constYX&v)const{return!(*this==v);}friendTdot(constYX&u,constYX&v){returnu.y*v.y+u.x*v.x;}Tsquare_abs(){returndot(*this,*this);}Tabs(){returnsqrt(square_abs());}friendstd::istream&operator>>(std::istream&is,YX&v){is>>v.y>>v.x;returnis;}friendstd::ostream&operator<<(std::ostream&os,constYX&v){os<<v.y<<" "<<v.x;returnos;}staticYXdirection(constchar&c){if(c=='R')return{0,1};if(c=='L')return{0,-1};if(c=='U')return{-1,0};if(c=='D')return{1,0};return{0,0};}};