제출 #1302253

#제출 시각아이디문제언어결과실행 시간메모리
1302253tuncay_pashaDeda (COCI17_deda)C++20
140 / 140
566 ms4556 KiB
#include "bits/stdc++.h"

using namespace std;

#ifdef debug
  #include "debug.hpp"
#else
  #define dbg(...)
  #define dbgx(x)
  #define line()
#endif

#define vi vector<int>
#define vvi vector<vi>
#define pii pair<int, int>
#define size(x) (int)(x.size())

struct SegTree {
  vi st;

  SegTree(int n) {
    st.assign(n * 4 + 5, 1e9);
  }

  void update(int v, int tl, int tr, int i, int x) {
    if (tl == tr) {
      st[v] = x;
      return;
    }
    int tm = (tl + tr) >> 1;
    if (i <= tm) {
      update(v * 2, tl, tm, i, x);
    }
    else {
      update(v * 2 + 1, tm + 1, tr, i, x);
    }
    st[v] = min(st[v * 2], st[v * 2 + 1]);
  }

  int getRange(int v, int tl, int tr, int l, int r) {
    if (tr < l || r < tl) return 1e9;
    if (l <= tl && tr <= r) return st[v];
    int tm = (tl + tr) >> 1;
    return min(getRange(v * 2, tl, tm, l, r), getRange(v * 2 + 1, tm + 1, tr, l, r));
  }
};

void _() {
  int n, q;
  cin >> n >> q;
  SegTree st(n);
  while (q--) {
    char c;
    cin >> c;
    if (c == 'M') {
      int i, x;
      cin >> x >> i;
      st.update(1, 1, n, i, x);
    }
    else {
      int i, x;
      cin >> x >> i;
      int lo = i, hi = n, best = -1;
      while (lo <= hi) {
        int mid = (lo + hi) >> 1;
        if (st.getRange(1, 1, n, i, mid) <= x) {
          best = mid;
          hi = mid - 1;
        }
        else lo = mid + 1;
      }
      cout << best << '\n';
    }
  }
}

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  // freopen("in.txt", "r", stdin);
  int t = 1;
  // cin >> t;
  for (int cs = 1; cs <= t; ++cs) {
    _();
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...