#include<bits/stdc++.h>
#define cen cout << endl
#define c1 cout << 1 << " "
#define cs cout << " ";
using namespace std;
void f(){
}
int cnt=0;
int ans=0;
struct li{double k,b;}ar[1000009];
struct Tree{int l,r,id;}tree[10000009];
bool cmp(int i,int j,int x){
if(ar[i].k*x+ar[i].b-ar[j].k*x-ar[j].b>1e-9){
return 1;
}
if(ar[j].k*x+ar[j].b-ar[i].k*x-ar[i].b>1e-9){
return 0;
}
return i<j;
}
void insert(int &x,int l,int r,int sl,int sr,int now){
if(r<sl||sr<l){
return;
}
if(!x){
x=++cnt;
}
if(sl<=l&&r<=sr){
if(cmp(now,tree[x].id,l)&&cmp(now,tree[x].id,r)){
tree[x].id=now;
return;
}
if(cmp(tree[x].id,now,l)&&cmp(tree[x].id,now,r)){
return;
}
int mid=(l+r)/2;
if(cmp(now,tree[x].id,mid)){
swap(now,tree[x].id);
}
if(cmp(now,tree[x].id,l)){
insert(tree[x].l,l,mid,sl,sr,now);
}
if(cmp(now,tree[x].id,r)){
insert(tree[x].r,mid+1,r,sl,sr,now);
}
}
else{
int mid=(l+r)/2;
insert(tree[x].l,l,mid,sl,sr,now);
insert(tree[x].r,mid+1,r,sl,sr,now);
}
}
void query(int x,int l,int r,int s){
if(!x||tree[x].r<l||r<tree[x].l){
return;
}
if(cmp(tree[x].id,ans,s)){
ans=tree[x].id;
}
int mid=(l+r)/2;
query(tree[x].l,l,mid,s);
query(tree[x].r,mid+1,r,s);
}
signed main(){
int q;
cin >> q;
int lastans=0;
int i=0;
while(q--){
int op;
cin >> op;
if(op){
int a,b,c,d;
cin >> a >> b >> c >> d;
a=(a+lastans-1)%39989+1;
b=(b+lastans-1)%100000000+1;
c=(c+lastans-1)%39989+1;
d=(d+lastans-1)%100000000+1;
i++;
if(a>c){
swap(a,c);
swap(b,d);
}
if(a==c){
ar[i].k=0;
ar[i].b=max(b,d);
}
else{
ar[i].k=1.0*(d-b)/(c-a);
ar[i].b=1.0*b-ar[i].k*a;
}
int temp=0;
insert(temp,1,39989,a,c,i);
}
else{
ans=0;
int x;
cin >> x;
x=(x+lastans-1)%39989+1;
query(1,1,39989,x);
lastans=ans;
cout << ans;
cen;
}
}
return 0;
}