一开始我和大佬想的是二分再套线段树,然后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;
}