#include<bits/stdc++.h>
using namespace std;
typedef pair<double,int> pdi;
const int N=1e5+5,M1=39989,M2=1e9;
struct le{
double k,b;
};
struct node{
int l,r;
int p;
}tr[4*N];
int n;
int cnt,lastans=0;
le l[N];
const double eps=1e-9;
void build(int l,int r,int k)
{
tr[k].l=l,tr[k].r=r;
tr[k].p=0;
if(l==r) return ;
int mid=(l+r)/2;
build(l,mid,2*k);
build(mid+1,r,2*k+1);
}
void add_len(int x0,int y0,int x1,int y1)
{
cnt++;
if(x0==x1)
{
l[cnt].k=0;
l[cnt].b=max(y0,y1);
}
else
{
l[cnt].k=1.0*(y1-y0)/(x1-x0);
l[cnt].b=y1-l[cnt].k*x1;
}
}
double calc(int p,int x)
{
return l[p].b+l[p].k*x;
}
int cmp(double a,double b)
{
if(a-b>eps) return 1;
if(a-b<eps) return -1;
return 0;
}
void upd(int k,int x,int y,int up)
{
int &p=tr[k].p,mid=(x+y)/2;
int bmid=cmp(calc(up,mid),calc(p,mid));
if (bmid==1 || (!bmid &&up<p)) swap(up,p);
int bl=cmp(calc(up,x),calc(p,x)),br=cmp(calc(up,y),calc(p,y));
if (bl==1||(!bl&&up<p)) upd(k<<1,x,mid,up);
if (br==1||(!br&&up<p)) upd(k<<1|1,mid + 1,y,up);
}
void update(int k,int x,int y,int up)
{
int l=tr[k].l,r=tr[k].r;
if(x<=l&&r<=y)
{
upd(k,l,r,up);
return ;
}
int mid=(l+r)/2;
if(x<=mid) update(2*k,x,y,up);
if(y>mid) update(2*k+1,x,y,up);
}
pdi pmx(pdi x,pdi y)
{
if (cmp(x.first, y.first) == -1)
return y;
else if (cmp(x.first, y.first) == 1)
return x;
else
return x.second < y.second ? x : y;
}
pdi query(int k,int x)
{
int l=tr[k].l,r=tr[k].r;
if(l>x||r<x) return {0,0};
int mid=(l+r)/2;
double ans=calc(tr[k].p,x);
if(l==r)
return (pdi){ans,tr[k].p};
return pmx((pdi){ans,tr[k].p},pmx(query(2*k,x),query(2*k+1,x)));
}
int main()
{
cin>>n;
build(1,M1,1);
for(int i=1;i<=n;i++)
{
int op;
cin>>op;
if(op==0)
{
int k;
cin>>k;
k=(k+lastans-1+M1)%M1+1;
lastans=query(1,k).second;
cout<<lastans<<endl;
}
else
{
int x0,y0,x1,y1;
cin>>x0>>y0>>x1>>y1;
if(x1<x0)
{
swap(x1,x0);
swap(y1,y0);
}
x0=(x0+lastans-1+M1)%M1+1;
y0=(y0+lastans-1+M2)%M2+1;
x1=(x1+lastans-1+M1)%M1+1;
y1=(y1+lastans-1+M2)%M2+1;
add_len(x0,y0,x1,y1);
update(1,x0,x1,cnt);
}
}
return 0;
}