代码:
#include<bits/stdc++.h>//我嘞个c++
using namespace std;
#define int long long
#define double long double
#define endl '\n'
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define ms(x,y) memset(x,y,sizeof(x))
#define lowbit(x) x&(-x)
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while(ch > 57 || ch < 48)
{
if(ch == 45) f = -1;
ch = getchar();
}
while(ch >= 48 && ch <= 57)
{
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x * f;
}
const double eps = 1e-9;
int cmp(double x, double y)
{
if (x - y > eps) return 1;
if (y - x > eps) return -1;
return 0;
}
int n;
double k[200010], b[200010];
int cnt;
int f[400010];
inline pair<double,int> max(pair<double,int> x, pair<double,int> y)
{
// cout << x.fi << ' ' << y.fi << endl;
if(cmp(x.fi, y.fi) == -1) return y;
else if(cmp(x.first, y.first) == 1) return x;
else return x.second < y.second ? x : y;
}
inline double Y(int id, int x)
{
return k[id]*x+b[id];
}
inline void update(int k, int l, int r, int u)
{
int mid = l + r >> 1;
int &v = f[k];
int bmid = cmp(Y(u, mid), Y(v, mid));
if (bmid == 1 || (!bmid && u < v)) swap(u, v);
int bl = cmp(Y(u, l), Y(v, l)), br = cmp(Y(u, r), Y(v, r));
if (bl == 1 || (!bl && u < v)) update(k << 1, l, mid, u);
if (br == 1 || (!br && u < v)) update(k << 1 | 1, mid + 1, r, u);
}
inline void add(int k, int l, int r, int x, int y, int id)
{
if(l > y || r < x) return;
if(r <= y && l >= x)
{
update(k,l,r,id);
return;
}
int mid = l + r >> 1;
add(k<<1,l,mid,x,y,id);
add(k<<1|1,mid+1,r,x,y,id);
}
inline pair<double,int> query(int k, int l, int r, int u)
{
pair<double,int> mmax;
mmax = mk(Y(f[k],u),f[k]);
if(l == r) return mmax;
int mid = l + r >> 1;
if(u <= mid) return max(mmax,query(k<<1,l,mid,u));
else return max(mmax,query(k<<1|1,mid+1,r,u));
}
int mod = 1e9;
signed main()
{
n = read();
int ans = 0;
while(n--)
{
int id = read();
if(id)
{
int x0 = read(), y0 = read(), x1 = read(), y1 = read();
x0 = ((x0+ans-1)%39989) + 1;
y0 = ((y0+ans-1)%mod) + 1;
x1 = ((x1+ans-1)%39989) + 1;
y1 = ((y1+ans-1)%mod) + 1;
if(x0 > x1) swap(x0, x1), swap(y0, y1);
if(x0 == x1)
{
k[++cnt] = 0, b[cnt] = max(y0,y1);
}
else
{
k[++cnt] = 1.0*(y1-y0)/(x1-x0);
b[cnt] = (1.0*y0*x1-1.0*y1*x0)/(x1-x0);
}
// cout << x0 << ' ' << x1 <<endl;
// cout << k[cnt] << ' ' << b[cnt] << endl;
add(1,1,39989,x0,x1,cnt);
}
else
{
int x = read();
x = ((x+ans-1+39989)%39989) + 1;
// --x;
ans = query(1,1,40000,x).se;
// if(ans < 0) ans = 0;
cout << ans << endl;
}
}
return 0;
}