Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int m[max_v], arr[max_v];
- int n, q, s = 1; //n for size, q for query and s for something later
- void make_tree(){
- while(s <= n) s *= 2; s *= 2;
- for(int i = s - 1; i < n + s - 1; i++){
- m[i] = arr[i - (s - 1)];
- }
- for(int i = s - 2; i >= 0; i--){
- m[i] = max(m[LC(i)], m[RC(i)]);
- }
- }
- void U(int p, int val, int k, int L, int R){
- if(L < p || p <= R || R <= L) return ;
- if(L + 1 == R){
- assert(L == p);
- m[k] = val;
- return ;
- }
- int mid = (L + R) / 2;
- U(p, val, LC(k), L, mid);
- U(p, val, RC(k), mid, R);
- m[k] = max(m[LC(k)], m[RC(k)]);
- }
- int Q(int qL, int qR, int k, int L, int R){
- if(qR <= L || R <= qL || R <= L) return 0;
- if(qL <= L && R <= qR) return m[k];
- int mid = (L + R) / 2;
- return max(Q(qL, qR, LC(k), L, mid), Q(qL, qR, RC(k), mid, R));
- }
Add Comment
Please, Sign In to add comment