/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 532.0 KiB
#2 Accepted 1ms 380.0 KiB
#3 Accepted 142ms 1.043 MiB
#4 Accepted 223ms 6.777 MiB
#5 Accepted 563ms 32.027 MiB
#6 Accepted 561ms 32.027 MiB
#7 Accepted 561ms 32.031 MiB
#8 Accepted 561ms 32.07 MiB
#9 Accepted 1150ms 34.59 MiB
#10 Accepted 1139ms 65.25 MiB
#11 Accepted 270ms 1.27 MiB

Code

#include <bits/stdc++.h>
using namespace std;

#define FAST ios_base::sync_with_stdio(false);cin.tie(NULL);
using ll = long long;


template<typename T, typename U = T>
struct SegmentTree {
  int n;
  vector<T> tree;

  // ----------

  template<typename VAL_T>
  T get_tree_val(VAL_T& val) {
    return {val};
  }

  T merge(T a, T b) {
    T c;
    std::merge(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c));
    return c;
  }

  // ----------

  SegmentTree(int n = 0) : n(n) {
    tree.resize(n<<2);
  }

  template<typename VAL_T>
  SegmentTree(vector<VAL_T>& data) : SegmentTree((int)data.size()) {
    __build(0, 0, n-1, data);
  }

  template<typename VAL_T>
  void __build(int ti, int left, int right, vector<VAL_T>& data) {
    if (left == right) {
      tree[ti] = get_tree_val(data[left]);
      return;
    }

    int tl, tr, tm;
    tl = (ti<<1)+1;
    tr = (ti<<1)+2;
    tm = (left+right)>>1;

    __build(tl, left, tm, data);
    __build(tr, tm+1, right, data);
    tree[ti] = merge(tree[tl], tree[tr]);
  }

  int __query_l(int ti, int left, int right, int l, int r, int x) {
    if ((l <= left) && (right <= r)) {
      int cnt = lower_bound(tree[ti].begin(), tree[ti].end(), x) - tree[ti].begin();
      return cnt;
    }

    int tl, tr, tm;
    tl = (ti<<1)+1;
    tr = (ti<<1)+2;
    tm = (left+right)>>1;

    if (l > tm) return __query_l(tr, tm+1, right, l, r, x);
    if (r <= tm) return __query_l(tl, left, tm, l, r, x);
    return (
      __query_l(tl, left, tm, l, r, x) +
      __query_l(tr, tm+1, right, l, r, x)
    );
  }

  int query_l(int l, int r, int x) { return __query_l(0, 0, n-1, l, r, x); }
};

int main() {
  FAST;
  
  int tc = 1, ti;
  cin >> tc;

  for (ti = 1; ti <= tc; ++ti) {
    ll n, q, i, l, r, l0, l1, r0, r1, ans;
    cin >> n;

    vector<ll> a(n);
    for (i = 0; i < n; ++i) cin >> a[i];

    SegmentTree<vector<ll>> seg(a);

    cin >> q; while (q--) {
      cin >> l >> i >> r;
      --l; --i; --r;

      l0 = l1 = r0 = r1 = 0;
      l0 = seg.query_l(l, i, a[i]);
      l1 = i-l+1 - seg.query_l(l, i, a[i]+1);
      r0 = seg.query_l(i, r, a[i]);
      r1 = r-i+1 - seg.query_l(i, r, a[i]+1);

      ans = l0*r1 + r0*l1;
      cout << ans << "\n";
    }
  }

  return 0;
}

Information

Submit By
Type
Submission
Problem
P1082 Roy and Query (Hard Version)
Contest
Brain Booster #6
Language
C++17 (G++ 13.2.0)
Submit At
2024-10-03 15:50:25
Judged At
2024-10-03 15:50:25
Judged By
Score
100
Total Time
1150ms
Peak Memory
65.25 MiB