Problem p00998 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define INF 0x3f3f3f3f
using namespace std;

uint xor128() {
  static uint x = 1, y = 3, z = 5, w = 8;
  uint t = x ^ (x << 11);
  x = y;
  y = z;
  z = w;
  return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
}
struct node {
  node *l, *r;
  uint pri;
  int cnt, val, Min;
};
node pool[400000];
int p;

inline int cnt(node *t) { return t ? t->cnt : 0; }
inline int Min(node *t) { return t ? t->Min : INF; }

inline node *update(node *t) {
  t->cnt = cnt(t->l) + cnt(t->r) + 1;
  t->Min = min({t->val, Min(t->l), Min(t->r)});
  return t;
}
inline node *merge(node *l, node *r) {
  if (!l)
    return r;
  if (!r)
    return l;
  if (l->pri > r->pri) {
    l->r = merge(l->r, r);
    return update(l);
  } else {
    r->l = merge(l, r->l);
    return update(r);
  }
}
inline pair<node *, node *> split(node *t, int k) {
  if (!t)
    return make_pair((node *)NULL, (node *)NULL);
  if (k <= cnt(t->l)) {
    auto p = split(t->l, k);
    t->l = p.second;
    return make_pair(p.first, update(t));
  } else {
    auto p = split(t->r, k - cnt(t->l) - 1);
    t->r = p.first;
    return make_pair(update(t), p.second);
  }
}

int main() {
  int n, q;
  scanf("%d%d", &n, &q);
  node *root = NULL;
  rep(i, n) {
    int a;
    scanf("%d", &a);
    node *t = &pool[p++];
    *t = {NULL, NULL, xor128(), 1, a, a};
    root = merge(root, t);
  }
  rep(i, q) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    if (x == 0) {
      z++;
      auto a = split(root, y);
      auto b = split(a.second, z - y - 1);
      auto c = split(b.second, 1);
      root = merge(merge(merge(a.first, c.first), b.first), c.second);
    } else if (x == 1) {
      z++;
      auto a = split(root, y);
      auto b = split(a.second, z - y);
      printf("%d\\n", Min(b.first));
      root = merge(merge(a.first, b.first), b.second);
    } else {
      auto a = split(root, y);
      auto b = split(a.second, 1);
      b.first->val = b.first->Min = z;
      root = merge(merge(a.first, b.first), b.second);
    }
  }
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define INF 0x3f3f3f3f
using namespace std;

uint xor128() {
  static uint x = 1;
  static uint y = 3;
  static uint z = 5;
  static uint w = 8;
  uint t = x ^ (x << 11);
  x = y;
  y = z;
  z = w;
  return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
}
struct node {
  node *l, *r;
  uint pri;
  int cnt, val, Min;
};
node pool[400000];
int p;

inline int cnt(node *t) { return t ? t->cnt : 0; }
inline int Min(node *t) { return t ? t->Min : INF; }

inline node *update(node *t) {
  t->cnt = cnt(t->l) + cnt(t->r) + 1;
  t->Min = min({t->val, Min(t->l), Min(t->r)});
  return t;
}
inline node *merge(node *l, node *r) {
  if (!l)
    return r;
  if (!r)
    return l;
  if (xor128() & 1 /*l->pri>r->pri*/) {
    l->r = merge(l->r, r);
    return update(l);
  } else {
    r->l = merge(l, r->l);
    return update(r);
  }
}
inline pair<node *, node *> split(node *t, int k) {
  if (!t)
    return make_pair((node *)NULL, (node *)NULL);
  if (k <= cnt(t->l)) {
    auto p = split(t->l, k);
    t->l = p.second;
    return make_pair(p.first, update(t));
  } else {
    auto p = split(t->r, k - cnt(t->l) - 1);
    t->r = p.first;
    return make_pair(update(t), p.second);
  }
}

int main() {
  int n, q;
  scanf("%d%d", &n, &q);
  node *root = NULL;
  rep(i, n) {
    int a;
    scanf("%d", &a);
    node *t = &pool[p++];
    *t = {NULL, NULL, xor128(), 1, a, a};
    root = merge(root, t);
  }
  rep(i, q) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    if (x == 0) {
      z++;
      auto a = split(root, y);
      auto b = split(a.second, z - y - 1);
      auto c = split(b.second, 1);
      root = merge(merge(merge(a.first, c.first), b.first), c.second);
    } else if (x == 1) {
      z++;
      auto a = split(root, y);
      auto b = split(a.second, z - y);
      printf("%d\\n", Min(b.first));
      root = merge(merge(a.first, b.first), b.second);
    } else {
      auto a = split(root, y);
      auto b = split(a.second, 1);
      b.first->val = b.first->Min = z;
      root = merge(merge(a.first, b.first), b.second);
    }
  }
}