OLE是啥呀? OLErecord 代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
inline ll read(){
ll x=0;
short f=1;
char c=getchar();
while(c>57||c<48){
if(c==45) f=-1;
c=getchar();
}
while(c<58&&c>47){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
inline void write(ll x){
if(x<0ll) putchar(45),x=~x+1;
if(x>9ll) write(x/10);
putchar(x%10|48);
}
int n=read();
int lastans=0;
int _get(){
return (read()+lastans-1)%39989+1;
}
int _ret(int x){
write(lastans=x);
putchar(10);
}
#define eps 1e-7
int dcmp(double a,double b){
return abs(a-b)<eps?0:(a<b)?-1:1;
}
struct Seg{
int sx,ex,sy,ey;
double k;
Seg(){}
Seg(int xs,int xe,int ys,int ye){
sx=xs;ex=xe;ey=ye;sy=ys;
k=sx==ex?(ey=sy=max(ey,sy),0):(0.+ey-sy)/(ex-sx);
}
double get(int p){
return sx+k*(p-sy);
}
}S[100005];
double getx(Seg x,Seg y){
return (y.get(0)-x.get(0))/(x.k-y.k);
}
int idx;
int cmp(Seg s1,Seg s2,int cmpp){
return dcmp(s1.get(cmpp),s2.get(cmpp));
}
int mx[400005],lp[400005],rp[400005];
#define ls id<<1
#define rs id<<1|1
void build(int id,int l,int r){
// if(id>100000)printf("%d:%d %d\n",id,l,r);
mx[id]=0;
lp[id]=l;
rp[id]=r;
if(l==r) return;
build(ls,l,l+r>>1);
build(rs,(l+r>>1)+1,r);
}
void modify(int id,int cg){
double _sy=S[mx[id]].get(lp[id]),_ey=S[mx[id]].get(rp[id]),nsy=S[cg].get(lp[id]),ney=S[cg].get(rp[id]);
if(dcmp(nsy,_sy)!=1&&dcmp(nsy,_sy)!=1) return;
if(dcmp(nsy,_sy)==1&&dcmp(nsy,_sy)==1) return mx[id]=cg,void();
int mid=lp[id]+rp[id]>>1;
double _my=S[mx[id]].get(mid),nmy=S[cg].get(mid);
if(nmy-_my>1e-7) swap(mx[id],cg);
if(dcmp(getx(S[cg],S[mx[id]]),mid)!=1) modify(ls,cg);
else modify(rs,cg);
}
void update(int id,int x){
if(lp[id]>S[x].ex||rp[id]<S[x].sx) return;
if(S[x].sx<=lp[id]&&rp[id]<=S[x].ex){
modify(id,x);
// printf("%d-%d~%d\n",id,lp[id],rp[id]);
return ;
}
update(ls,x);
update(rs,x);
}
int ans;
int query(int id,int pos){
if(lp[id]==rp[id]){
return mx[id];
}
int ret=pos<=(lp[id]+rp[id]>>1)?query(ls,pos):query(rs,pos);
return (dcmp(S[ret].get(pos),S[mx[id]].get(pos))==0?min(ret,mx[id]):dcmp(S[ret].get(pos),S[mx[id]].get(pos))==1?ret:mx[id]);
}
void print(int l,int r,int id=1){
// if(lp[id]>=l&&rp[id]<=r) printf("%d:%d~%d %d\n",id,lp[id],rp[id],mx[id]);
if(lp[id]==rp[id]) return;
print(l,r,ls);
print(l,r,rs);
}
signed main(){
build(1,1,40000);
for(int i=1;i<=n;i++){
int op=read();
if(op==1){
int x1=_get(),y1=_get(),x2=_get(),y2=_get();
if(x2<x1) swap(x2,x1),swap(y2,y1);
S[++idx]=Seg(x1,x2,y1,y2);
update(1,idx);
}
else{
int x=_get();
_ret(query(1,x));
}
// print(1,12);
}
}