1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  | // 더 많은 정보는 42jerrykim.github.io 에서 확인하세요.
#include <bits/stdc++.h>
using namespace std;
struct Fenwick {
    int n;
    vector<int> bit;
    Fenwick(int n) : n(n), bit(n + 1, 0) {}
    void add(int i, int v) {
        for (; i <= n; i += i & -i) bit[i] += v;
    }
    int sum(int i) const {
        int s = 0;
        for (; i > 0; i -= i & -i) s += bit[i];
        return s;
    }
};
struct Query { int l, r, k, idx; };
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N; if(!(cin >> N)) return 0;
    vector<pair<int,int>> arr(N); // {value, index(1-based)}
    for(int i=0;i<N;++i){ int a; cin >> a; arr[i] = {a, i+1}; }
    int M; cin >> M;
    vector<Query> qs(M);
    for(int i=0;i<M;++i){ int l,r,k; cin >> l >> r >> k; qs[i] = {l,r,k,i}; }
    sort(arr.begin(), arr.end(), [](const auto& x, const auto& y){ return x.first > y.first; });
    sort(qs.begin(), qs.end(), [](const Query& a, const Query& b){ return a.k > b.k; });
    Fenwick fw(N);
    vector<int> ans(M);
    int p = 0; // pointer in arr
    for(const auto& q : qs){
        while(p < N && arr[p].first > q.k){
            fw.add(arr[p].second, 1);
            ++p;
        }
        ans[q.idx] = fw.sum(q.r) - fw.sum(q.l - 1);
    }
    for(int i=0;i<M;++i) cout << ans[i] << '\n';
    return 0;
}
  |