#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; using namespace atcoder; typedef long long ll; typedef pair P; template struct SegmentTree{ using F=function; int sz; vector seg; F f; Monoid e; SegmentTree(){} SegmentTree(int n, const F f, const Monoid &e): f(f), e(e){ sz=1; while(sz v): f(f), e(e){ sz=1; while(sz=1; i--){ seg[i]=f(seg[2*i], seg[2*i+1]); } } void init(int n, const F f1, const Monoid &e1){ f=f1, e=e1; sz=1; while(sz1){ k>>=1; seg[k]=f(seg[2*k], seg[2*k+1]); } } Monoid query(int a, int b){ a+=sz, b+=sz; Monoid ret=e; for(;a>=1, b>>=1){ if(b&1) ret=f(ret, seg[--b]); if(a&1) ret=f(ret, seg[a++]); } return ret; } /*Monoid query(int a, int b){ //演算が非可換のとき a+=sz, b+=sz; Monoid retl=e, retr=e; for(;a>=1, b>>=1){ if(b&1) retr=f(seg[--b], retr); if(a&1) retl=f(retl, seg[a++]); } return f(retl, retr); }*/ Monoid operator[](const int &k) const{ return seg[k+sz]; } }; int l[100010], r[100010]; ll s[100010]; int t[100010], lq[100010], rq[100010]; ll sq[100010]; int main() { int n, q; cin>>n>>q; for(int i=0; i>a>>b>>c>>d>>e>>f; l[i]=min({a, c, e}), r[i]=max({a, c, e}); c-=a, e-=a, d-=b, f-=b; s[i]=abs(c*f-d*e); } for(int i=0; i>t[i]; if(t[i]==1){ ll a, b, c, d, e, f; cin>>a>>b>>c>>d>>e>>f; lq[i]=min({a, c, e}), rq[i]=max({a, c, e}); c-=a, e-=a, d-=b, f-=b; sq[i]=abs(c*f-d*e); }else{ cin>>lq[i]>>rq[i]; rq[i]++; } } vector vl, vr; for(int i=0; i> seg(2*sz); for(int i=0; i1){ k>>=1; seg[k].push_back({r[i], s[i]}); } } for(int i=0; i1){ k>>=1; seg[k].push_back({rq[i], sq[i]}); } } for(int i=2*sz-1; i>=0; i--) sort(seg[i].begin(), seg[i].end()); vector> segm(2*sz); for(int i=1; i<2*sz; i++){ segm[i].init((int)seg[i].size(), [](ll x, ll y){ return max(x, y);}, -1ll); } for(int i=0; i1){ k>>=1; int u=lower_bound(seg[k].begin(), seg[k].end(), P(r[i], s[i]))-seg[k].begin(); segm[k].update(u, s[i]); } } for(int i=0; i1){ k>>=1; int u=lower_bound(seg[k].begin(), seg[k].end(), P(rq[i], sq[i]))-seg[k].begin(); segm[k].update(u, sq[i]); } }else{ int l1=lower_bound(vl.begin(), vl.end(), lq[i])-vl.begin(); int a=l1+sz, b=2*sz; ll mx=-1; for(;a>=1, b>>=1){ if(b&1){ b--; int u=lower_bound(seg[b].begin(), seg[b].end(), P(rq[i], 0))-seg[b].begin(); mx=max(mx, segm[b].query(0, u)); } if(a&1){ int u=lower_bound(seg[a].begin(), seg[a].end(), P(rq[i], 0))-seg[a].begin(); mx=max(mx, segm[a].query(0, u)); a++; } } cout<