제출 #1151201

#제출 시각아이디문제언어결과실행 시간메모리
1151201rxlfd314Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
100 / 100
1296 ms116376 KiB
#include <bits/stdc++.h>
using namespace std;
template <class T> using vt = vector<T>;
#define all(x) begin(x), end(x)
#define size(x) (int((x).size()))
#define REP(a,b,c,d) for(int a=(b);(d)>0?a<=(c):a>=(c);a+=(d))
#define FOR(a,b,c) REP(a,b,c,1)
#define ROF(a,b,c) REP(a,b,c,-1)

struct ST {
  const int N;
  vt<int> ans, st_const, lset;
  ST(const int n) : N(n), ans(n<<2), st_const(n<<2), lset(n<<2, -1) {}
  #define lc i << 1
  #define rc lc | 1
  void build(const vt<int> &A, const int i, const int tl, const int tr) {
    if (tl == tr)
      st_const[i] = A[tl];
    else {
      const int tm = tl + tr >> 1;
      build(A, lc, tl, tm);
      build(A, rc, tm+1, tr);
      st_const[i] = max(st_const[lc], st_const[rc]);
    }
  }
  void build(const vt<int> &A) {
    build(A, 1, 0, N-1);
  }
  void push(const int i) {
    if (lset[i] < 0)
      return;
    lset[lc] = lset[rc] = lset[i];
    ans[lc] = st_const[lc] + lset[i];
    ans[rc] = st_const[rc] + lset[i];
    lset[i] = -1;
  }
  void rset(const int ql, const int qr, const int v, const int i, const int tl, const int tr) {
    if (tl > qr || tr < ql)
      return;
    if (ql <= tl && tr <= qr)
      ans[i] = st_const[i] + v, lset[i] = v;
    else {
      push(i);
      const int tm = tl + tr >> 1;
      rset(ql, qr, v, lc, tl, tm);
      rset(ql, qr, v, rc, tm+1, tr);
      ans[i] = max(ans[lc], ans[rc]);
    }
  }
  void rset(const int ql, const int qr, const int v) {
    rset(ql, qr, v, 1, 0, N-1);
  }
  int query(const int ql, const int qr, const int i, const int tl, const int tr) {
    if (tl > qr || tr < ql)
      return 0;
    if (ql <= tl && tr <= qr)
      return ans[i];
    push(i);
    const int tm = tl + tr >> 1;
    return max(query(ql, qr, lc, tl, tm), query(ql, qr, rc, tm+1, tr));
  }
  int query(const int ql, const int qr) {
    return query(ql, qr, 1, 0, N-1);
  }
  #undef lc
  #undef rc
};

signed main() {
#ifndef DEBUG
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
#endif
  int N, M;
  cin >> N >> M;
  vt<int> A(N);
  for (auto &i : A)
    cin >> i;
  vt<int> L(M), R(M), K(M);
  vt<vt<int>> sweep(N);
  FOR(i, 0, M-1) {
    cin >> L[i] >> R[i] >> K[i], L[i]--, R[i]--;
    sweep[L[i]].push_back(i);
  }
  
  ST st(N);
  st.build(A);
  vt<int> stk, ans(M);
  ROF(i, N-1, 0) {
    while (size(stk) && A[i] > A[stk.back()])
      stk.pop_back();
    const int j = size(stk) ? stk.back() : N;
    st.rset(i+1, j-1, A[i]);
    stk.push_back(i);
    for (const auto &q : sweep[i])
      ans[q] = st.query(L[q], R[q]) <= K[q];
  }
  
  for (const auto &i : ans)
    cout << i << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...