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

#include <algorithm>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <tuple>
#include <utility>
#include <vector>
#define loop(i, a, b) for (int i = (a); i < int(b); i++)
#define rep(i, n) loop(i, 0, n)

using namespace std;

int const inf = 1e9;

unsigned int xor128() {
  static unsigned int x = 123456789, y = 362436069, z = 521288629, w = time(0);
  unsigned long t = x ^ (x << 11);
  x = y;
  y = z;
  z = w;
  return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
}

template <class T> struct Node {
  T val;
  Node *ch[2];
  int pri, cnt;
  T min_;
  static Node *nil;
  Node(T v, int p) : val(v), pri(p), cnt(1), min_(v) { ch[0] = ch[1] = nil; }
  void *operator new(size_t) {
    static int pos = 0;
    static char mem[600020 * sizeof(Node)];
    Node *res = (Node *)(mem + pos);
    pos += sizeof(Node);
    return res;
  }
  int size() { return this->cnt; }
  T min() { return this->min_; }
  T sum() { return this->sum_; }
  void show(int ofs = 0) {
    if (ch[0] != nil)
      ch[0]->show(ofs + 1);
    rep(i, ofs * 2) putchar(' ');
    printf("v:%d m:%d (%p)\\n", val, min_, this);
    if (ch[1] != nil)
      ch[1]->show(ofs + 1);
  }
  void update() {
    cnt = ch[0]->size() + ch[1]->size() + 1;
    min_ = std::min({ch[0]->min(), ch[1]->min(), val});
  }
  Node *merge(Node *r) {
    if (this == nil || r == nil)
      return this == nil ? r : this;
    if (pri > r->pri) {
      ch[1] = ch[1]->merge(r);
      update();
      return this;
    } else {
      r->ch[0] = merge(r->ch[0]);
      r->update();
      return r;
    }
  }
  pair<Node *, Node *> split(int k) {
    int lc = ch[0]->size();
    if (k <= lc) {
      auto s = ch[0] != nil ? ch[0]->split(k) : make_pair(nil, nil);
      ch[0] = s.second;
      update();
      return make_pair(s.first, this);
    } else {
      auto s = ch[1] != nil ? ch[1]->split(k - lc - 1) : make_pair(nil, nil);
      ch[1] = s.first;
      update();
      return make_pair(this, s.second);
    }
  }
  Node *erase(int k) {
    Node *l, *m, *r;
    tie(l, m) = split(k);
    tie(m, r) = m->split(1);
    // delete m;
    return l->merge(r);
  }
  Node *at(int k) {
    int lc = ch[0]->size();
    if (k < lc)
      return ch[0]->at(k);
    else if (k == lc)
      return this;
    else
      return ch[1]->at(k - lc - 1);
  }
  void set(int k, T x) {
    int lc = ch[0]->size();
    if (k < lc)
      ch[0]->set(k, x);
    else if (k == lc)
      val = x;
    else if (k > lc)
      ch[1]->set(k - lc - 1, x);
    update();
  }
  Node *insert(int k, T v) {
    Node *l, *m = new Node(v, xor128()), *r;
    tie(l, r) = split(k);
    return l->merge(m)->merge(r);
  }
  T min(int l, int r) {
    if (r - l <= 0)
      return inf;
    if (r - l == this->size())
      return this->min();
    int lc = ch[0]->size();
    T res = inf;
    if (l <= lc && lc < r)
      res = std::min(res, this->val);
    res = std::min(res, ch[0]->min(l, std::min(r, lc)));
    res = std::min(res, ch[1]->min(std::max(0, l - lc - 1), r - lc - 1));
    return res;
    // if(r - l <= 0) return inf;
    // if(r - l == this->size()) return this->min();
    // int lc = ch[0]->size();
    // if(l == lc && r - lc == 1) return val;
    // T res = inf;
    // if(l < lc) res = std::min(res, ch[0]->min(l, std::min(lc, r)));
    // if(l <= lc && lc < r) res = std::min(res, min(lc, lc+1));
    // if(lc + 1 < r) res = std::min(res, ch[1]->min(max(0, l-lc-1), r-lc-1));
    // return res;
  }
};
template <class T> Node<T> *Node<T>::nil = new Node<T>(0, 0);

template <class T> struct Treap {
  Node<T> *root;
  int size;
  Treap() : root(Node<T>::nil), size(0) {
    root->nil->cnt = 0;
    root->nil->min_ = inf;
  }
  // ~Treap(){
  //     delete root;
  // }
  void shift(int l, int r) {
    T tmp = root->at(r - 1)->val;
    root = root->erase(r - 1);
    root = root->insert(l, tmp);
  }
  void set(int k, T x) { root->set(k, x); }
  T min(int l, int r) { return root->min(l, r); }
  void push_back(T x) {
    if (size == 0)
      root = new Node<T>(x, xor128()), size++;
    else
      root = root->insert(size++, x);
  }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  int n, q;
  cin >> n >> q;
  Treap<int> t;
  rep(i, n) {
    int x;
    cin >> x;
    t.push_back(x);
  }
  rep(i, q) {
    int op;
    cin >> op;
    if (false) {
    } else if (op == 0) {
      int l, r;
      cin >> l >> r;
      t.shift(l, r + 1);
    } else if (op == 1) {
      int l, r;
      cin >> l >> r;
      cout << t.min(l, r + 1) << '\\n';
    } else if (op == 2) {
      int p, v;
      cin >> p >> v;
      t.set(p, v);
    }
  }
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <tuple>
#include <utility>
#include <vector>
#define loop(i, a, b) for (int i = (a); i < int(b); i++)
#define rep(i, n) loop(i, 0, n)

using namespace std;

int const inf = 1e9;

unsigned int xor128() {
  static unsigned int x = 123456789, y = 362436069, z = 521288629, w = time(0);
  unsigned long t = x ^ (x << 11);
  x = y;
  y = z;
  z = w;
  return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
}

template <class T> struct Node {
  T val;
  Node *ch[2];
  int pri, cnt;
  T min_;
  static Node *nil;
  Node(T v, int p) : val(v), pri(p), cnt(1), min_(v) { ch[0] = ch[1] = nil; }
  void *operator new(size_t) {
    static int pos = 0;
    static char mem[600020 * sizeof(Node)];
    Node *res = (Node *)(mem + pos);
    pos += sizeof(Node);
    return res;
  }
  int size() { return this->cnt; }
  T min() { return this->min_; }
  T sum() { return this->sum_; }
  void show(int ofs = 0) {
    if (ch[0] != nil)
      ch[0]->show(ofs + 1);
    rep(i, ofs * 2) putchar(' ');
    printf("v:%d m:%d (%p)\\n", val, min_, this);
    if (ch[1] != nil)
      ch[1]->show(ofs + 1);
  }
  void update() {
    cnt = ch[0]->size() + ch[1]->size() + 1;
    min_ = std::min({ch[0]->min(), ch[1]->min(), val});
  }
  Node *merge(Node *r) {
    if (this == nil || r == nil)
      return this == nil ? r : this;
    if (pri > r->pri) {
      ch[1] = ch[1]->merge(r);
      update();
      return this;
    } else {
      r->ch[0] = merge(r->ch[0]);
      r->update();
      return r;
    }
  }
  pair<Node *, Node *> split(int k) {
    int lc = ch[0]->size();
    if (k <= lc) {
      auto s = ch[0] != nil ? ch[0]->split(k) : make_pair(nil, nil);
      ch[0] = s.second;
      update();
      return make_pair(s.first, this);
    } else {
      auto s = ch[1] != nil ? ch[1]->split(k - lc - 1) : make_pair(nil, nil);
      ch[1] = s.first;
      update();
      return make_pair(this, s.second);
    }
  }
  Node *erase(int k) {
    Node *l, *m, *r;
    tie(l, m) = split(k);
    tie(m, r) = m->split(1);
    // delete m;
    return l->merge(r);
  }
  Node *at(int k) {
    int lc = ch[0]->size();
    if (k < lc)
      return ch[0]->at(k);
    else if (k == lc)
      return this;
    else
      return ch[1]->at(k - lc - 1);
  }
  void set(int k, T x) {
    int lc = ch[0]->size();
    if (k < lc)
      ch[0]->set(k, x);
    else if (k == lc)
      val = x;
    else if (k > lc)
      ch[1]->set(k - lc - 1, x);
    update();
  }
  Node *insert(int k, T v) {
    Node *l, *m = new Node(v, xor128()), *r;
    tie(l, r) = split(k);
    return l->merge(m)->merge(r);
  }
  T min(int l, int r) {
    if (r - l <= 0)
      return inf;
    int lc = ch[0]->size();
    T res = inf;
    if (l <= lc && lc < r)
      res = std::min(res, this->val);
    res = std::min(res, ch[0]->min(l, std::min(r, lc)));
    res = std::min(res, ch[1]->min(std::max(0, l - lc - 1), r - lc - 1));
    return res;
    // if(r - l <= 0) return inf;
    // if(r - l == this->size()) return this->min();
    // int lc = ch[0]->size();
    // if(l == lc && r - lc == 1) return val;
    // T res = inf;
    // if(l < lc) res = std::min(res, ch[0]->min(l, std::min(lc, r)));
    // if(l <= lc && lc < r) res = std::min(res, min(lc, lc+1));
    // if(lc + 1 < r) res = std::min(res, ch[1]->min(max(0, l-lc-1), r-lc-1));
    // return res;
  }
};
template <class T> Node<T> *Node<T>::nil = new Node<T>(0, 0);

template <class T> struct Treap {
  Node<T> *root;
  int size;
  Treap() : root(Node<T>::nil), size(0) {
    root->nil->cnt = 0;
    root->nil->min_ = inf;
  }
  // ~Treap(){
  //     delete root;
  // }
  void shift(int l, int r) {
    T tmp = root->at(r - 1)->val;
    root = root->erase(r - 1);
    root = root->insert(l, tmp);
  }
  void set(int k, T x) { root->set(k, x); }
  T min(int l, int r) { return root->min(l, r); }
  void push_back(T x) {
    if (size == 0)
      root = new Node<T>(x, xor128()), size++;
    else
      root = root->insert(size++, x);
  }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  int n, q;
  cin >> n >> q;
  Treap<int> t;
  rep(i, n) {
    int x;
    cin >> x;
    t.push_back(x);
  }
  rep(i, q) {
    int op;
    cin >> op;
    if (false) {
    } else if (op == 0) {
      int l, r;
      cin >> l >> r;
      t.shift(l, r + 1);
    } else if (op == 1) {
      int l, r;
      cin >> l >> r;
      cout << t.min(l, r + 1) << '\\n';
    } else if (op == 2) {
      int p, v;
      cin >> p >> v;
      t.set(p, v);
    }
  }
}