#include<bits/stdc++.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<unordered_map>
#include<set>
#include<list>
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define inf 0x3f3f3f3f3f
#define INF 0x7f7f7f7f7f
using namespace std;
namespace Iwara{
template<class T> T MAX(T x,T y){
return x>y?x:y;
}
template<class T,class ... Arg> T MAX(T x,T y,Arg ... arg){
return MAX(x>y?x:y,arg...);
}
template<class T> T MIN(T x,T y){
return x<y?x:y;
}
template<class T,class ... Arg> T MIN(T x,T y,Arg ... arg){
return MIN(x<y?x:y,arg...);
}
template<class T> T lowbit(T x){
return x&-x;
}
template<class T> void SWAP(T &x,T &y){
T qwq;
qwq=x;
x=y;
y=qwq;
return;
}
}
using namespace Iwara;
const ll MOD1=39989,MOD2=1e9;
ll n,lastans=0;
struct line{
ldb k,b;
};
line Line[MOD1+5];
ll tot;
void add_line(ll x0,ll y0,ll x1,ll y1){
tot++;
if(x0==x1){
Line[tot].k=0,Line[tot].b=MAX(y0,y1);
return;
}
Line[tot].k=1.0*(y1-y0)/(x1-x0),Line[tot].b=y0-Line[tot].k*x0;
return;
}
ldb calc(ll id,ll d){
return Line[id].b+Line[id].k*d*1.0;
}
ll s[MOD1<<2];
void update(ll id,ll L,ll R,ll UL,ll UR,ll f){
// cout<<id<<" "<<L<<" "<<R<<" "<<UL<<" "<<UR<<" "<<f<<endl;
if(UR<L||R<UL)return;
ll g=s[id];
ll mid=(L+R)>>1;
ldb m_g=calc(g,mid),m_f=calc(f,mid);
if(UL<=L&&R<=UR){
if(L==R){
if(m_f>m_g)s[id]=f;
return;
}
if(Line[g].k<Line[f].k){
if(m_f>m_g){
s[id]=f;
update(id<<1,L,mid,UL,UR,f);
}
else update((id<<1)+1,mid+1,R,UL,UR,f);
}
else if(Line[g].k>Line[f].k){
if(m_f>m_g){
s[id]=f;
update((id<<1)+1,mid+1,R,UL,UR,f);
}
else update(id<<1,L,mid,UL,UR,f);
}
else{
if(Line[f].b>Line[g].b)s[id]=f;
}
return;
}
update(id<<1,L,mid,UL,UR,f);
update((id<<1)+1,mid+1,R,UL,UR,f);
return;
}
pair<ldb,ll> p_max(pair<ldb,ll> p1,pair<ldb,ll> p2){
return p1.first!=p2.first?(p1.first>p2.first?p1:p2):(p1.second<p2.second?p1:p2);
}
pair<ldb,ll> query(ll id,ll L,ll R,ll d){
if(d<L||d>R)return {0,0};
ll mid=(L+R)>>1;
ldb res=calc(s[id],d);
if(L==R)return {res,s[id]};
return p_max({res,s[id]},p_max(query(id<<1,L,mid,d),query((id<<1)+1,mid+1,R,d)));
}
int main(){
cin>>n;
for(int i=1,op,qwq,x0,x1,y0,y1;i<=n;i++){
cin>>op;
if(op==0){
cin>>qwq;
qwq=((qwq+lastans-1+MOD1)%MOD1+1);
cout<<(lastans=query(1,1,MOD1,qwq).second)<<endl;
}
else{
cin>>x0>>y0>>x1>>y1;
x0=((x0+lastans-1+MOD1)%MOD1+1);
x1=((x1+lastans-1+MOD1)%MOD1+1);
y0=((y0+lastans-1+MOD2)%MOD2+1);
y1=((y1+lastans-1+MOD2)%MOD2+1);
if(x0>x1)SWAP(x0,x1),SWAP(y0,y1);
// cout<<x0<<" "<<y0<<" "<<x1<<" "<<y1<<endl;
add_line(x0,y0,x1,y1);
update(1,1,MOD1,x0,x1,tot);
}
}
return 0;
}
Segment
求调/kk