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

#include <iostream>
#include <random>
#include <string>
#include <vector>

#define REP(i, n) for (int i = 0; i < (n); ++i)

using namespace std;

struct Myrand {
  uint64_t val;
  Myrand() : val(859238598) {}
  uint64_t operator()() { return val = val * val + 737598437; }
} my_rand;

typedef int Data;

const int INF = 1e8;

struct RBST {
  Data value;
  RBST *left;
  RBST *right;
  int cnt;
  Data minv;
  RBST(Data v) : value(v), left(nullptr), right(nullptr), cnt(1), minv(v) {}
};

int count(RBST *t) { return !t ? 0 : t->cnt; }
Data minv(RBST *t) { return !t ? INF : t->minv; }
RBST *update(RBST *t) {
  t->cnt = count(t->left) + count(t->right) + 1;
  t->minv = min(min(minv(t->left), minv(t->right)), t->value);
  return t;
}

RBST *merge(RBST *l, RBST *r) {
  if (!l || !r)
    return !l ? r : l;

  int cnt_sum = count(l) + count(r);
  // rand()?????¨?°????????????????????????????????£?????????£??????????????¨??????????????§???mt19937??¨????????????????£??????????
  if ((my_rand() % cnt_sum) < count(l)) {
    l->right = merge(l->right, r);
    return update(l);
  } else {
    r->left = merge(l, r->left);
    return update(r);
  }
}

pair<RBST *, RBST *> split(RBST *t, int k) {
  if (!t)
    return make_pair(nullptr, nullptr);

  if (k <= count(t->left)) {
    auto s = split(t->left, k);
    t->left = s.second;
    return make_pair(s.first, update(t));
  } else {
    auto s = split(t->right, k - count(t->left) - 1);
    t->right = s.first;
    return make_pair(update(t), s.second);
  }
}

RBST *insert(RBST *t, int k, Data v) {
  auto s = split(t, k);
  return merge(s.first, merge(new RBST(v), s.second));
}

RBST *erase(RBST *t, int k) {
  auto s1 = split(t, k);
  auto s2 = split(s1.second, 1);
  delete s2.first;
  return merge(s1.first, s2.second);
}

int main() {
  srand(0);
  RBST *root = nullptr;
  int n, q;
  cin >> n >> q;
  REP(i, n) {
    int a;
    cin >> a;
    root = insert(root, i, a);
  }
  REP(i, q) {
    int x, y, z;
    cin >> x >> y >> z;
    switch (x) {
    case 0: {
      auto b = split(root, z + 1);
      auto f = split(b.first, y);
      auto s = split(f.second, z - y);
      RBST *ns = merge(s.second, s.first);
      RBST *nf = merge(f.first, ns);
      root = merge(nf, b.second);
    } break;
    case 1: {
      auto b = split(root, z + 1);
      auto f = split(b.first, y);
      cout << f.second->minv << endl;
      RBST *nf = merge(f.first, f.second);
      root = merge(nf, b.second);
    } break;
    case 2: {
      root = erase(root, y);
      root = insert(root, y, z);
    } break;
    }
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <iostream>
#include <random>
#include <string>
#include <vector>

#define REP(i, n) for (int i = 0; i < (n); ++i)

using namespace std;

struct Myrand {
  random_device rd;
  mt19937 mt;
  Myrand() : rd(), mt(rd()) {}
  int operator()() { return mt(); }
} my_rand;

typedef int Data;

const int INF = 1e8;

struct RBST {
  Data value;
  RBST *left;
  RBST *right;
  int cnt;
  Data minv;
  RBST(Data v) : value(v), left(nullptr), right(nullptr), cnt(1), minv(v) {}
};

int count(RBST *t) { return !t ? 0 : t->cnt; }
Data minv(RBST *t) { return !t ? INF : t->minv; }
RBST *update(RBST *t) {
  t->cnt = count(t->left) + count(t->right) + 1;
  t->minv = min(min(minv(t->left), minv(t->right)), t->value);
  return t;
}

RBST *merge(RBST *l, RBST *r) {
  if (!l || !r)
    return !l ? r : l;

  int cnt_sum = count(l) + count(r);
  // rand()?????¨?°????????????????????????????????£?????????£??????????????¨??????????????§???mt19937??¨????????????????£??????????
  if ((my_rand() % cnt_sum) < count(l)) {
    l->right = merge(l->right, r);
    return update(l);
  } else {
    r->left = merge(l, r->left);
    return update(r);
  }
}

pair<RBST *, RBST *> split(RBST *t, int k) {
  if (!t)
    return make_pair(nullptr, nullptr);

  if (k <= count(t->left)) {
    auto s = split(t->left, k);
    t->left = s.second;
    return make_pair(s.first, update(t));
  } else {
    auto s = split(t->right, k - count(t->left) - 1);
    t->right = s.first;
    return make_pair(update(t), s.second);
  }
}

RBST *insert(RBST *t, int k, Data v) {
  auto s = split(t, k);
  return merge(s.first, merge(new RBST(v), s.second));
}

RBST *erase(RBST *t, int k) {
  auto s1 = split(t, k);
  auto s2 = split(s1.second, 1);
  delete s2.first;
  return merge(s1.first, s2.second);
}

int main() {
  srand(0);
  RBST *root = nullptr;
  int n, q;
  cin >> n >> q;
  REP(i, n) {
    int a;
    cin >> a;
    root = insert(root, i, a);
  }
  REP(i, q) {
    int x, y, z;
    cin >> x >> y >> z;
    switch (x) {
    case 0: {
      auto b = split(root, z + 1);
      auto f = split(b.first, y);
      auto s = split(f.second, z - y);
      RBST *ns = merge(s.second, s.first);
      RBST *nf = merge(f.first, ns);
      root = merge(nf, b.second);
    } break;
    case 1: {
      auto b = split(root, z + 1);
      auto f = split(b.first, y);
      cout << f.second->minv << endl;
      RBST *nf = merge(f.first, f.second);
      root = merge(nf, b.second);
    } break;
    case 2: {
      root = erase(root, y);
      root = insert(root, y, z);
    } break;
    }
  }
  return 0;
}