Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class SegmentTreeFC {
- int sz;
- vector< vector<int> > t, tl, tr;
- void build(int v, int vl, int vr, const vector<int> &a) {
- if (vl == vr) {
- t[v].push_back(a[vl]);
- return;
- }
- int vm = vl + (vr - vl) / 2;
- build(2 * v + 1, vl, vm, a);
- build(2 * v + 2, vm + 1, vr, a);
- int l = 2 * v + 1, r = 2 * v + 2;
- int ls = t[l].size(), rs = t[r].size(), ts = ls + rs;
- t[v].resize(ts);
- tl[v].resize(ts + 1);
- tr[v].resize(ts + 1);
- tl[v][ts] = ls;
- tr[v][ts] = rs;
- for (int i = ts - 1, li = ls - 1, ri = rs - 1; i >= 0; i--) {
- if (li < 0)
- t[v][i] = t[r][ri--];
- else if (ri < 0)
- t[v][i] = t[l][li--];
- else if (t[l][li] > t[r][ri])
- t[v][i] = t[l][li--];
- else
- t[v][i] = t[r][ri--];
- tl[v][i] = (li >= 0 && t[l][li] >= t[v][i] ? li : li + 1);
- tr[v][i] = (ri >= 0 && t[r][ri] >= t[v][i] ? ri : ri + 1);
- }
- }
- int query(int v, int vl, int vr, int l, int r, int k, int ub) const {
- if (ub == -1)
- ub = upper_bound(t[v].begin(), t[v].end(), k) - t[v].begin();
- if (r < vl || vr < l)
- return 0;
- if (l <= vl && vr <= r)
- return vr - vl + 1 - ub;
- int vm = vl + (vr - vl) / 2;
- int ql = query(2 * v + 1, vl, vm, l, r, k, tl[v][ub]);
- int qr = query(2 * v + 2, vm + 1, vr, l, r, k, tr[v][ub]);
- return ql + qr;
- }
- public:
- SegmentTreeFC(const vector<int> &a) {
- sz = a.size();
- t.resize(4 * sz);
- tl.resize(4 * sz);
- tr.resize(4 * sz);
- build(0, 0, sz - 1, a);
- }
- int query(int l, int r, int k) const {
- return query(0, 0, sz - 1, l, r, k, -1);
- }
- };
- int main() {
- int aSize;
- scanf("%d", &aSize);
- vector<int> a(aSize);
- for (int i = 0; i < aSize; i++)
- scanf("%d", &a[i]);
- SegmentTreeFC st(a);
- int queriesCount;
- scanf("%d", &queriesCount);
- for (int i = 0; i < queriesCount; i++) {
- int l, r, k;
- scanf("%d%d%d", &l, &r, &k);
- printf("%d\n", st.query(l - 1, r - 1, k));
- }
- }
Add Comment
Please, Sign In to add comment