| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 
 | #include<bits/stdc++.h>#define int long long
 using namespace std;
 
 template<class Info>
 struct SegmentTree {
 int n;
 vector<Info> info;
 
 SegmentTree() : n(0) {}
 SegmentTree(int n_, Info v_ = Info()) {
 init(n_, v_);
 }
 template<class T>
 SegmentTree(vector<T> init_) {
 init(init_);
 }
 void init(int n_, Info v_ = Info()) {
 init(vector<Info>(n_, v_));
 }
 template<class T>
 void init(vector<T> init_) {
 n = init_.size();
 info.assign(4 << __lg(n), Info());
 function<void(int, int, int)> build = [&](int p, int l, int r) {
 if (r - l == 1) {
 info[p] = init_[l];
 return;
 }
 int m = (l + r) / 2;
 build(2 * p, l, m);
 build(2 * p + 1, m, r);
 pull(p);
 };
 build(1, 0, n);
 }
 
 void pull(int p) {
 info[p] = info[2 * p] + info[2 * p + 1];
 }
 
 void modify(int p, const Info &v) {
 modify(1, 0, n, p, v);
 }
 void modify(int p, int l, int r, int x, const Info &v) {
 if (r - l == 1) {
 info[p] = v;
 return;
 }
 int m = (l + r) / 2;
 if (x < m) {
 modify(2 * p, l, m, x, v);
 } else {
 modify(2 * p + 1, m, r, x, v);
 }
 pull(p);
 }
 
 Info query(int l, int r) {
 return query(1, 0, n, l, r);
 }
 Info query(int p, int l, int r, int x, int y) {
 if (l >= y || r <= x) {
 return Info();
 }
 if (l >= x && r <= y) {
 return info[p];
 }
 int m = (l + r) / 2;
 return query(2 * p, l, m, x, y) + query(2 * p + 1, m, r, x, y);
 }
 };
 
 constexpr int inf = 1e18;
 struct Info {
 int inc_max;
 int inc_min;
 int dec_max;
 int dec_min;
 int ans;
 Info() : inc_max(-inf), dec_max(-inf), dec_min(inf), inc_min(inf), ans(0) {}
 Info(int x, int i) : inc_max(x - i), inc_min(x - i), dec_max(x + i), dec_min(x + i), ans(0) {}
 };
 
 Info operator+(const Info &a, const Info &b){
 Info c;
 c.inc_max = max(a.inc_max, b.inc_max);
 c.inc_min = min(a.inc_min, b.inc_min);
 c.dec_max = max(a.dec_max, b.dec_max);
 c.dec_min = min(a.dec_min, b.dec_min);
 c.ans = max({a.ans, b.ans, b.inc_max - a.inc_min, a.dec_max - b.dec_min});
 return c;
 }
 
 void solve(){
 int n, q; cin >> n >> q;
 SegmentTree<Info> seg(n);
 for(int i = 0; i < n; i++){
 int a; cin >> a;
 seg.modify(i, Info(a, i));
 }
 cout << seg.query(0, n).ans << '\n';
 while(q--){
 int p, x; cin >> p >> x; p--;
 seg.modify(p, Info(x, p));
 cout << seg.query(0, n).ans << '\n';
 }
 }
 
 signed main(){
 ios::sync_with_stdio(0);
 cin.tie(0);
 int t; cin >> t;
 while(t--) solve();
 return 0;
 }
 
 |