Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 1000007
- using namespace std;
- int seg[4*MAX], arr[MAX], n;
- void build(int id, int l, int r){
- if(l == r) seg[id] = arr[l];
- else{
- int mid = (l+r)/2;
- build(2*id, l, mid);
- build(2*id+1, mid+1, r);
- seg[id] = max(seg[2*id],seg[2*id+1]);
- }
- }
- void update(int id, int l, int r, int val, int x){
- if(l == r) seg[id] = val;
- else{
- int mid = (l+r)/2;
- if(mid >= x) update(2*id, l, mid, val, x);
- else update(2*id+1, mid+1, r, val, x);
- seg[id] = max(seg[2*id],seg[2*id+1]);
- }
- }
- int query(int id, int l, int r, int x, int y){
- if(l > y || r < x) return 0;
- else if( x <= l && r <= y) return seg[id];
- else{
- int mid = (l+r)/2;
- return max(query(2*id, l, mid, x, y), query(2*id+1, mid+1, r, x, y));
- }
- }
- int pos, h;
- int bb(int l, int r, int type){
- while(l <= r){
- int mid = (l+r)/2;
- int prelude;
- if(type) prelude = query(1, 1, n
- , pos, mid);
- else prelude = query(1, 1, n, pos-mid, pos);
- cout << "Mid -> " << mid << " result = " << prelude << endl;
- if(prelude >= h) r = mid-1;
- else l = mid+1;
- }
- return type? l: pos-l;
- }
- int vals[MAX];
- int main(){
- int q; scanf("%d %d", &n, &q);
- for(int i = 1; i <= n; i++) scanf("%d", &vals[i]);
- for(int i = 1; i <= n; i++) arr[i] = abs(vals[i]-vals[i+1]);
- build(1, 1, n);
- while(q--){
- int type; scanf("%d", &type);
- if(type == 1){
- int pos, val;scanf("%d %d", &pos, &val);
- vals[pos] = val;
- arr[pos] = abs(vals[pos]-vals[pos+1]);
- arr[pos-1] = abs(vals[pos-1]-vals[pos]);
- update(1, 1, n, arr[pos], pos);
- update(1, 1, n, arr[pos-1], pos-1);
- }else if(type == 2){
- scanf("%d %d", &pos, &h);
- h = h+1;
- cout << "L -> " << bb(1, pos, 0) << " R -> " << bb(pos,n-1, 1) << endl;
- printf("%d\n", bb(pos,n-1, 1)-bb(1, pos, 0));
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement