struct Line{
LL k,b;
LL Y(LL x){return k*x+b;}
}tree[MAXN*25+5];
int ch[MAXN*25+5][2];
int ncnt,Root;
bool pan(Line a,Line b,int x){return a.Y(x)<b.Y(x);}
void Insert(int &u,LL L,LL R,Line p){
if(!u){
u=++ncnt,ch[u][0]=ch[u][1]=0,tree[u]=p;
return ;
}
if(pan(tree[u],p,L)&&pan(tree[u],p,R)){
tree[u]=p;
return ;
}
if(L==R) return ;
LL Mid=(L+R)>>1;
if(pan(tree[u],p,Mid))
swap(tree[u],p);
if(pan(tree[u],p,L))
Insert(lch,L,Mid,p);
if(pan(tree[u],p,R))
Insert(rch,Mid+1,R,p);
return ;
}
LL Query(int u,LL L,LL R,int x){
LL ret=tree[u].Y(x);
if(L==R) return ret;
LL Mid=(L+R)>>1;
if(x<=Mid&&lch)
ret=max(ret,Query(lch,L,Mid,x));
if(Mid<x&&rch)
ret=max(ret,Query(rch,Mid+1,R,x));
return ret;
}
李超线段树
最新推荐文章于 2022-11-13 21:46:27 发布