一开始我和大佬想的是二分再套线段树,然后tle了,想不到优化然后就查网了,如果左子树满足条件就不要递归右子树了可以优化一下,然后如果整段区间的最大值也不满足那就没必要往下递归了。
int query(int m,int l,int r,int val){
if(tree[m].l==tree[m].r)
{
if(tree[m].val>=val)
return tree[m].l;
return -1;
}
if(tree[m].l>=l && tree[m].r<=r && tree[m].val<val)
return -1;
int mid=(tree[m].l+tree[m].r)>>1;
int p1=-1,p2=-1;
if(r<=mid) return query(m<<1,l,r,val);
else if(l>mid) return query(m<<1|1,l,r,val);
int temp=query(m<<1,l,r,val);
if(temp!=-1)
return temp;
return query(m<<1|1,l,r,val);
// int p1=-1,p2=-1;
// if(l<=mid)
// p1=query(m<<1,l,r,val);
// if(r>mid)
// p2=query(m<<1|1,l,r,val);
// if(p1!=-1)
// return p1;
// if(p2!=-1)
// return p2;
}