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;
}
|