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

/*
　　　  ∧＿∧　やあ
　　 （´・ω・｀)　　　　　/　　　　　ようこそ、バーボンハウスへ。
　　 ／∇y:::::＼　　　
[￣]　　　　　このテキーラはサービスだから、まず飲んで落ち着いて欲しい。 　　
|:⊃:|:::::|　　　|──|
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣|　うん、「また」なんだ。済まない。
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣|￣　
仏の顔もって言うしね、謝って許してもらおうとも思っていない。
￣￣￣￣￣￣￣￣￣￣￣￣￣￣／|
　　　　∇　∇　∇　∇　　　／.／|　　　でも、この提出を見たとき、君は、きっと言葉では言い表せない
　　　　┴　┴　┴　┴　／ ／　
|　　　「ときめき」みたいなものを感じてくれたと思う。
￣￣￣￣￣￣￣￣￣￣|／　　
|　　　殺伐としたコンテストの中で、そういう気持ちを忘れないで欲しい
￣￣￣￣￣￣￣￣￣￣　　　　 |　　　そう思って、この提出を投げたんだ。
　　　(⊆⊇)　(⊆⊇)　(⊆⊇)　　|
　    ||　　 ||　　||　　|　　　 じゃあ、判定を聞こうか。
　　.／|＼　／|＼ ／|＼
*/

#include <algorithm>
#include <array>
#include <bitset>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>
using namespace std;
#define fst first
#define snd second
#define ALL(obj) (obj).begin(), (obj).end()
#define debug(x)                                                               \\
  cerr << #x << " -> " << x << " (line:" << __LINE__ << ")" << '\\n';
#define debugpair(x, y)                                                        \\
  cerr << "(" << #x << ", " << #y << ") -> (" << x << ", " << y                \\
       << ") (line:" << __LINE__ << ")" << '\\n';
typedef long long lint;
typedef priority_queue<int> p_que;
typedef priority_queue<int, vector<int>, greater<int>> p_que_rev;
const lint INF = INT_MAX;
const lint LINF = LLONG_MAX;
const lint MOD = 1000000000 + 7;
const double EPS = 1e-9;
const double PI = acos(-1);
const int di[]{0, -1, 0, 1, -1, -1, 1, 1};
const int dj[]{1, 0, -1, 0, 1, -1, -1, 1};

int main() {
  int n, q;
  scanf("%d %d", &n, &q);
  const int init_value = 2147483647;
  int b_size = floor(sqrt(n));
  int b_num = n / b_size;
  if (b_num * b_size < n) {
    b_num++;
  }
  vector<int> a(b_num * b_size);
  vector<int> b(b_num);
  for (int i = 0; i < b_num * b_size; ++i) {
    a[i] = init_value;
  }
  for (int i = 0; i < b_num; ++i) {
    b[i] = init_value;
  }
  int com, x, y, query_ans;
  int backet_num, b_l, b_r;
  for (int query = 0; query < q; ++query) {
    scanf("%d %d %d", &com, &x, &y);
    // update
    if (com == 0) {
      a[x] = y;
      backet_num = x / b_size;
      if (b[backet_num] >= y) {
        b[backet_num] = y;
      } else {
        b_l = backet_num * b_size;
        b[backet_num] = a[b_l];
        b_r = b_l + b_size;
        for (int i = b_l + 1; i < b_r; ++i) {
          if (b[backet_num] > a[i]) {
            b[backet_num] = a[i];
          }
        }
      }
    }
    // find
    else {
      ++y;
      query_ans = init_value;
      b_l = x / b_size + 1;
      b_r = y / b_size;
      for (int i = x; i < min(y, b_l * b_size); ++i) {
        query_ans = min(query_ans, a[i]);
      }
      for (int i = b_l; i < b_r; ++i) {
        query_ans = min(query_ans, b[i]);
      }
      for (int i = max(x, b_r * b_size); i < y; ++i) {
        query_ans = min(query_ans, a[i]);
      }
      printf("%d\\n", query_ans);
    }
    /*
    cout << "query: " << query << endl;
    for (int i=0; i<b_num*b_size; ++i){
        cout << a[i] << " ";
    }
    cout << endl;
    for (int i=0; i<b_num; ++i){
        cout << b[i] << " ";
    }
    cout << endl;
    */
  }
  return 0;
}


Error: TLE

Fixed submission:

/*
　　　  ∧＿∧　やあ
　　 （´・ω・｀)　　　　　/　　　　　ようこそ、バーボンハウスへ。
　　 ／∇y:::::＼　　　
[￣]　　　　　このテキーラはサービスだから、まず飲んで落ち着いて欲しい。 　　
|:⊃:|:::::|　　　|──|
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣|　うん、「また」なんだ。済まない。
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣|￣　
仏の顔もって言うしね、謝って許してもらおうとも思っていない。
￣￣￣￣￣￣￣￣￣￣￣￣￣￣／|
　　　　∇　∇　∇　∇　　　／.／|　　　でも、この提出を見たとき、君は、きっと言葉では言い表せない
　　　　┴　┴　┴　┴　／ ／　
|　　　「ときめき」みたいなものを感じてくれたと思う。
￣￣￣￣￣￣￣￣￣￣|／　　
|　　　殺伐としたコンテストの中で、そういう気持ちを忘れないで欲しい
￣￣￣￣￣￣￣￣￣￣　　　　 |　　　そう思って、この提出を投げたんだ。
　　　(⊆⊇)　(⊆⊇)　(⊆⊇)　　|
　    ||　　 ||　　||　　|　　　 じゃあ、判定を聞こうか。
　　.／|＼　／|＼ ／|＼
*/

#include <algorithm>
#include <array>
#include <bitset>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>
using namespace std;
#define fst first
#define snd second
#define ALL(obj) (obj).begin(), (obj).end()
#define debug(x)                                                               \\
  cerr << #x << " -> " << x << " (line:" << __LINE__ << ")" << '\\n';
#define debugpair(x, y)                                                        \\
  cerr << "(" << #x << ", " << #y << ") -> (" << x << ", " << y                \\
       << ") (line:" << __LINE__ << ")" << '\\n';
typedef long long lint;
typedef priority_queue<int> p_que;
typedef priority_queue<int, vector<int>, greater<int>> p_que_rev;
const lint INF = INT_MAX;
const lint LINF = LLONG_MAX;
const lint MOD = 1000000000 + 7;
const double EPS = 1e-9;
const double PI = acos(-1);
const int di[]{0, -1, 0, 1, -1, -1, 1, 1};
const int dj[]{1, 0, -1, 0, 1, -1, -1, 1};

int main() {
  int n, q;
  scanf("%d %d", &n, &q);
  const int init_value = 2147483647;
  int b_size = floor(sqrt(n));
  int b_num = n / b_size;
  if (b_num * b_size < n) {
    b_num++;
  }
  vector<int> a(b_num * b_size);
  vector<int> b(b_num);
  for (int i = 0; i < b_num * b_size; ++i) {
    a[i] = init_value;
  }
  for (int i = 0; i < b_num; ++i) {
    b[i] = init_value;
  }
  int com, x, y, itr, query_ans;
  int backet_num, b_l, b_r;
  for (int query = 0; query < q; ++query) {
    scanf("%d %d %d", &com, &x, &y);
    // update
    if (com == 0) {
      a[x] = y;
      backet_num = x / b_size;
      if (b[backet_num] >= y) {
        b[backet_num] = y;
      } else {
        b_l = backet_num * b_size;
        b[backet_num] = a[b_l];
        b_r = b_l + b_size;
        for (int i = b_l + 1; i < b_r; ++i) {
          if (b[backet_num] > a[i]) {
            b[backet_num] = a[i];
          }
        }
      }
    }
    // find
    else {
      itr = x;
      query_ans = init_value;
      backet_num = itr / b_size;
      b_l = backet_num * b_size;
      b_r = b_l + b_size - 1;
      while (x <= itr && itr <= y) {
        if (x <= b_l && b_r <= y) {
          if (query_ans > b[backet_num]) {
            query_ans = b[backet_num];
          }
          backet_num++;
          b_l += b_size;
          b_r += b_size;
        } else {
          if (query_ans > a[itr]) {
            query_ans = a[itr];
          }
          itr++;
          backet_num = itr / b_size;
          b_l = backet_num * b_size;
          b_r = b_l + b_size - 1;
        }
      }
      printf("%d\\n", query_ans);
    }
    /*
    cout << "query: " << query << endl;
    for (int i=0; i<b_num*b_size; ++i){
        cout << a[i] << " ";
    }
    cout << endl;
    for (int i=0; i<b_num; ++i){
        cout << b[i] << " ";
    }
    cout << endl;
    */
  }
  return 0;
}