【模板】线段树上二分
题目
给你一个长度为n的序列,q次询问,每次给出 l, r, k,要求在O(nlogn)时间内求出在[l,r]中最小的下标i,满足a[i]>k。
代码
int find(int u,int st,int ed,int l,int r,int k)
{if(mx[u]<=k)//判断无解return -1;if(st==ed) //就是这个了return st;//pushdown(u);int mid=st+ed>>1;if(l<=st&&ed<=r) //如果被包在里面,可以直接无顾虑的二分{int res=find(u<<1,st,mid,l,r,k);if(res!=-1)return res;return find(u<<1|1,mid+1,ed,l,r,k);}else //否则参考普通query{int res=-1;if(l<=mid)res=find(u<<1,st,mid,l,r,k);if(res==-1&&mid<r)res=find(u<<1|1,mid+1,ed,l,r,k);return res;}
}
