超哥线段树
#include<cstdio>
#include<algorithm>
using namespace std;
const int lim=39989;
const int Mod=1e9;
int ansid,ANS[2000005],Max[100005],Maxid[100005];
double ans;
struct node{
double k,b;
}Line[2000005];
inline double check(node a,node b){
return (a.b-b.b)/(b.k-a.k);
}
inline double calc(double x,node line){
return line.k*x+line.b;
}
inline void update(int t,node line,int ID){
Line[t]=line,ANS[t]=ID;
}
inline void insert(int t,int l,int r,int x,int y,node line,int ID){
if (l>y || r<x) return;
if (l>=x && r<=y){
double Lmax=calc(l,line),Rmax=calc(r,line);
double Lt=calc(l,Line[t]),Rt=calc(r,Line[t]);
if (Lmax<=Lt && Rmax<=Rt) return;
else if (Lmax>Lt && Rmax>Rt) update(t,line,ID);
else{
int mid=(l+r)>>1;
double Key=check(line,Line[t]);
node To=line;
int Toid=ID;
if (Key<=mid) {
if (Lmax<Lt) {
To=Line[t],Toid=ANS[t];
update(t,line,ID);
}
insert(t<<1,l,mid,x,y,To,Toid);
}
else {
if (Rmax<Rt){
To=Line[t],Toid=ANS[t];
update(t,line,ID);
}
insert(t<<1|1,mid+1,r,x,y,To,Toid);
}
}
return;
}
int mid=(l+r)>>1;
insert(t<<1,l,mid,x,y,line,ID);
insert(t<<1|1,mid+1,r,x,y,line,ID);
}
void query(int t,int l,int r,int key){
double Key=calc(key,Line[t]);
if (Key>ans || (Key==ans && ANS[t]<ansid)) ans=Key,ansid=ANS[t];
if (l==r) return;
int mid=(l+r)>>1;
if (key<=mid) query(t<<1,l,mid,key);
else query(t<<1|1,mid+1,r,key);
}
int main(){
int q;
scanf("%d",&q);
int Lastans=0,Num=0;
for (int i=1; i<=lim; i++) Max[i]=-1e9;
while (q--){
int cas;
scanf("%d",&cas);
if (!cas){
int X;
scanf("%d",&X);
X=(X+Lastans-1)%lim+1;
ans=ansid=0;
query(1,1,lim,X);
if (Max[X]>ans || (Max[X]==ans && Maxid[X]<ansid)) ans=Max[X],ansid=Maxid[X];
Lastans=ansid;
printf("%d\n",Lastans);
}
else{
int x0,y0,x1,y1;
scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
x0=(x0+Lastans-1)%lim+1,y0=(y0+Lastans-1)%Mod+1;
x1=(x1+Lastans-1)%lim+1,y1=(y1+Lastans-1)%Mod+1;
if (x0>x1) swap(x0,x1),swap(y0,y1);
Num++;
if (x0==x1){
int val=max(y0,y1);
if (val>Max[x0]) Max[x0]=val,Maxid[x0]=Num;
}
else{
double K=((double)y1-y0)/(x1-x0);
double B=y0-x0*K;
insert(1,1,lim,x0,x1,(node){K,B},Num);
}
}
}
return 0;
}