Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct Segtree //max with binary searching
- {
- ll tr[4000001];
- void build(int lo, int hi, int cur)
- {
- if (lo == hi)
- {
- tr[cur] = pre[lo];
- return;
- }
- int mid = (lo+hi)/2;
- build(lo, mid, cur*2);
- build(mid+1, hi, cur*2+1);
- tr[cur] = max(tr[cur*2], tr[cur*2+1]);
- }
- void build() { build(1, n, 1); }
- int find(ll k, int lo, int hi, int cur) //find lowest pos such that a[pos] >= k
- {
- if (lo == hi && tr[cur] >= k) return lo;
- int mid = (lo+hi)/2;
- if (tr[cur*2] >= k) return find(k, lo, mid, cur*2); //prioritize left (lower index)
- else if (tr[cur*2+1] >= k) return find(k, mid+1, hi, cur*2+1);
- else return -1;
- }
- int find(ll k) { return find(k, 1, n, 1); } //logn
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement