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

/*??????????????§RMQ????±???????*/
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
#define RMQ_MAX ((1LL << 31) - 1)
template <typename T> class SquareBucket {
public:
  SquareBucket() {}
  SquareBucket(const vector<T> &array) : val(array) {
    N = val.size();
    sqrtN = ceil(sqrt(N));
    B = (N + sqrtN - 1) / sqrtN;
    bucket.assign(B, RMQ_MAX);
    for (int i = 0; i < B; i++) {
      for (int j = sqrtN * i; j < sqrtN * (i + 1); j++) {
        if (j >= N)
          break;
        bucket[i] = min(bucket[i], val[j]);
      }
    }
  }
  void init(const vector<T> &array) {
    val = array;
    N = val.size();
    sqrtN = ceil(sqrt(N));
    B = (N + sqrtN - 1) / sqrtN;
    bucket.assign(B, RMQ_MAX);
    for (int i = 0; i < B; i++) {
      for (int j = sqrtN * i; j < sqrtN * (i + 1); j++) {
        if (j >= N)
          break;
        bucket[i] = min(bucket[i], val[j]);
      }
    }
  }
  void update(int node, T v) {
    val[node] = v;
    int X = node / sqrtN;
    bucket[X] = RMQ_MAX;
    for (int i = sqrtN * X; i < sqrtN * (X + 1); i++) {
      if (i >= N)
        break;
      bucket[X] = min(bucket[X], val[i]);
    }
  }
  /*[l, r)???RMQ*/
  T range_minimum(int left, int right) {
    int L = (left + sqrtN - 1) / sqrtN + 1;
    int R = right / sqrtN;
    T res = RMQ_MAX;
    if (L <= R) {
      for (int i = left; i < sqrtN * L; i++) {
        res = min(res, val[i]);
      }
      for (int i = L; i < R; i++) {
        res = min(res, bucket[i]);
      }
      for (int i = sqrtN * R; i < right; i++) {
        res = min(res, val[i]);
      }
    } else {
      for (int i = left; i < right; i++) {
        res = min(res, val[i]);
      }
    }
    return res;
  }

private:
  vector<T> val;
  vector<T> bucket;
  int N;
  int sqrtN;
  int B; // the number of bucket
};

int N, Q;
int main() {
  cin >> N >> Q;
  vector<int> arr;
  arr.resize(N, RMQ_MAX);
  SquareBucket<int> rmq(arr);
  for (int i = 0; i < Q; i++) {
    int com, x, y;
    cin >> com >> x >> y;
    if (com == 0) {
      rmq.update(x, y);
    } else {
      cout << rmq.range_minimum(x, y + 1) << endl;
    }
  }
}

Error: TLE

Fixed submission:

/*??????????????§RMQ????±???????*/
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
#define RMQ_MAX ((1LL << 31) - 1)
template <typename T> class SquareBucket {
public:
  SquareBucket() {}
  SquareBucket(const vector<T> &array) : val(array) {
    N = val.size();
    sqrtN = ceil(sqrt(N));
    B = (N + sqrtN - 1) / sqrtN;
    bucket.assign(B, RMQ_MAX);
    for (int i = 0; i < B; i++) {
      for (int j = sqrtN * i; j < sqrtN * (i + 1); j++) {
        if (j >= N)
          break;
        bucket[i] = min(bucket[i], val[j]);
      }
    }
  }
  void init(const vector<T> &array) {
    val = array;
    N = val.size();
    sqrtN = ceil(sqrt(N));
    B = (N + sqrtN - 1) / sqrtN;
    bucket.assign(B, RMQ_MAX);
    for (int i = 0; i < B; i++) {
      for (int j = sqrtN * i; j < sqrtN * (i + 1); j++) {
        if (j >= N)
          break;
        bucket[i] = min(bucket[i], val[j]);
      }
    }
  }
  /*[l, r)???RMQ*/
  T range_minimum(int left, int right) {
    int L = (left + sqrtN - 1) / sqrtN + 1;
    int R = right / sqrtN;
    T res = RMQ_MAX;
    if (L <= R) {
      for (int i = left; i < sqrtN * L; i++) {
        res = min(res, val[i]);
      }
      for (int i = L; i < R; i++) {
        res = min(res, bucket[i]);
      }
      for (int i = sqrtN * R; i < right; i++) {
        res = min(res, val[i]);
      }
    } else {
      for (int i = left; i < right; i++) {
        res = min(res, val[i]);
      }
    }
    return res;
  }

private:
  vector<T> val;
  vector<T> bucket;
  int N;
  int sqrtN;
  int B; // the number of bucket
};

int N, Q;
int main() {
  cin >> N >> Q;
  vector<int> arr;
  arr.resize(N, RMQ_MAX);
  for (int i = 0; i < Q; i++) {
    int com, x, y;
    cin >> com >> x >> y;
    if (com == 0) {
      arr[x] = y;
    } else {
      SquareBucket<int> rmq(arr);
      cout << rmq.range_minimum(x, y + 1) << endl;
    }
  }
}