Advertisement
Manioc

cu

Nov 6th, 2018
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 1000007
  3.  
  4. using namespace std;
  5. int seg[4*MAX], arr[MAX], n;
  6.  
  7. void build(int id, int l, int r){
  8.     if(l == r) seg[id] = arr[l];
  9.     else{
  10.         int mid = (l+r)/2;
  11.         build(2*id, l, mid);
  12.         build(2*id+1, mid+1, r);
  13.  
  14.         seg[id] = max(seg[2*id],seg[2*id+1]);
  15.     }
  16. }
  17.  
  18. void update(int id, int l, int r, int val, int x){
  19.     if(l == r) seg[id] = val;
  20.     else{
  21.         int mid = (l+r)/2;
  22.         if(mid >= x) update(2*id, l, mid, val, x);
  23.         else update(2*id+1, mid+1, r, val, x);
  24.  
  25.         seg[id] = max(seg[2*id],seg[2*id+1]);
  26.     }
  27. }
  28.  
  29. int query(int id, int l, int r, int x, int y){
  30.     if(l > y || r < x) return 0;
  31.     else if( x <= l && r <= y) return seg[id];
  32.     else{
  33.         int mid = (l+r)/2;
  34.         return max(query(2*id, l, mid, x, y), query(2*id+1, mid+1, r, x, y));
  35.     }
  36. }
  37.  
  38. int pos, h;
  39. int bb(int l, int r, int type){
  40.  
  41.     while(l <= r){
  42.         int mid = (l+r)/2;
  43.         int prelude;
  44.         if(type) prelude = query(1, 1, n
  45.         , pos, mid);
  46.         else prelude = query(1, 1, n, pos-mid, pos);
  47.  
  48.         cout << "Mid -> " << mid << " result = " << prelude << endl;
  49.         if(prelude >= h) r = mid-1;
  50.         else l = mid+1;
  51.     }
  52.  
  53.     return type? l: pos-l;
  54. }
  55.  
  56. int vals[MAX];
  57. int main(){
  58.     int q; scanf("%d %d", &n, &q);
  59.     for(int i = 1; i <= n; i++) scanf("%d", &vals[i]);
  60.  
  61.     for(int i = 1; i <= n; i++) arr[i] = abs(vals[i]-vals[i+1]);
  62.     build(1, 1, n);
  63.  
  64.     while(q--){
  65.         int type; scanf("%d", &type);
  66.         if(type == 1){
  67.             int pos, val;scanf("%d %d", &pos, &val);
  68.             vals[pos] = val;
  69.             arr[pos] = abs(vals[pos]-vals[pos+1]);
  70.             arr[pos-1] = abs(vals[pos-1]-vals[pos]);
  71.             update(1, 1, n, arr[pos], pos);
  72.             update(1, 1, n, arr[pos-1], pos-1);
  73.         }else if(type == 2){
  74.             scanf("%d %d", &pos, &h);
  75.             h = h+1;
  76.             cout << "L -> " <<  bb(1, pos, 0) << " R -> " << bb(pos,n-1, 1) << endl;
  77.             printf("%d\n", bb(pos,n-1, 1)-bb(1, pos, 0));
  78.         }
  79.     }
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement