李超树

#include<bits/stdc++.h>
#define ldb long double
#define pll pair<long double,long double>
#define fi first
#define se second
using namespace std;
constexpr int maxn=1e5+10,mo1=39989,mo2=1e9;
constexpr ldb eps=1e-8;
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0' || ch>'9')
    {
        if (ch == '-') f=-1;
        ch=getchar();
    }
    while (ch>='0' && ch<='9')
    {
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int n;
pll lik[maxn];
int id;
void getkb(int A,int B,int C,int D){
    if (A>C) swap(A,C),swap(B,D);
    id++;
    if (C == A) lik[id]={0,max(B,D)};
	else lik[id].fi=(ldb)(D-B)/(ldb)(C-A),lik[id].se=(ldb)D-(ldb)C*lik[id].fi;
}
namespace lcsgt
{
    #define ls (rt<<1)
    #define rs (rt<<1|1)
    #define mid ((t[rt].l+t[rt].r)>>1)
    struct _ {int l,r,v;}t[maxn<<2];
    ldb gety(int id,int x) {return lik[id].fi*(ldb)x+lik[id].se;}
    int cmp(int u,int v,int x)
    {
        if (gety(u,x)-gety(v,x)>eps) return 1;
        if (gety(v,x)-gety(u,x)>eps) return 0;
        return u<v;
    }
    void Build(int rt,int l,int r)
    {
        t[rt].l=l,t[rt].r=r;
        if (l == r) return;
        Build(ls,l,mid),Build(rs,mid+1,r);
    }
    void Ins(int rt,int x)
    {
        if (cmp(x,t[rt].v,t[rt].l) && cmp(x,t[rt].v,t[rt].r))
            t[rt].v=x;
        if (!cmp(x,t[rt].v,t[rt].l) && !cmp(x,t[rt].v,t[rt].r))
            return;
        if (cmp(x,t[rt].v,mid))
            swap(x,t[rt].v);
        if (cmp(x,t[rt].v,t[rt].l))
            Ins(ls,x);
        if (cmp(x,t[rt].v,t[rt].r))
            Ins(rs,x);
    }
    void Upd(int rt,int L,int R,int x)
    {
        if (L<=t[rt].l && t[rt].r<=R) return Ins(rt,x),void();
        if (L<=mid) Upd(ls,L,R,x);
        if (R>mid) Upd(rs,L,R,x);
    }
    int que(int rt,int x)
    {
        if (t[rt].l == t[rt].r)
            return t[rt].v;
        int res=0;
        if (x<=mid) res=que(ls,x);
        else res=que(rs,x);
        if (cmp(t[rt].v,res,x))
            res=t[rt].v;
        return res;
    }
}using namespace lcsgt;
signed main()
{
    Build(1,1,mo1);
    n=read();
    int lans=0;
    for (int i=1;i<=n;i++)
    {
        int op=read();
        if (!op)
        {
            int k=read();
            int x=(k+lans-1)%mo1+1;
            lans=que(1,x);
            printf("%d\n",lans);
        }
        else
        {
            int x0=read(),y0=read(),x1=read(),y_1=read();
            x0=(x0+lans-1)%mo1+1;
            y0=(y0+lans-1)%mo2+1;
            x1=(x1+lans-1)%mo1+1;
            y_1=(y_1+lans-1)%mo2+1;
            getkb(x0,y0,x1,y_1);
            // cerr << lik[id].fi << " " << lik[id].se << endl;
            // cerr << "---------------------" << endl;
            // cerr << x0 << " " << x1 << " " << id << endl;
            if (x0>x1) swap(x0,x1);
            Upd(1,x0,x1,id);
            // for (int i=1;i<=10;i++)
            //     cerr << que(1,i) << " ";
            // cerr << endl;
            // cerr << "---------------------" << endl;
        }
    }
	return 0;
}
posted @ 2026-08-15 16:16  msjing  阅读(5)  评论(0)    收藏  举报