Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int MAX = 100005;
- vector<int> tree[3 * MAX];
- int arr[MAX];
- vector<int> merge(vector<int> left, vector<int> right) {
- int ls = left.size(), rs = right.size();
- vector<int> par(ls + rs);
- int i = 0, j = 0, k = 0;
- while(i < ls && j < rs) {
- if(left[i] < right[j]) par[k++] = left[i++];
- else par[k++] = right[j++];
- }
- while(i < ls) {
- par[k++] = left[i++];
- }
- while(j < rs) {
- par[k++] = right[j++];
- }
- return par;
- }
- void build(int node, int s, int e) {
- if(s == e) {
- tree[node].push_back(arr[s]);
- return ;
- }
- int left = node << 1, right = left + 1, mid = (s + e) >> 1;
- build(left, s, mid);
- build(right, mid + 1, e);
- tree[node] = merge(tree[left], tree[right]);
- }
- int query(int node, int s, int e, int l, int r, int k) {
- if(s == l && e == r) {
- int id = (int)(upper_bound(tree[node].begin(), tree[node].end(), k) - tree[node].begin());
- return tree[node].size() - id;
- }
- int left = node << 1, right = left + 1, mid = (s + e) >> 1;
- if(r <= mid) {
- return query(left, s, mid, l, r, k);
- } else if(mid < l) {
- return query(right, mid + 1, e, l, r, k);
- } else {
- return query(left, s, mid, l, mid, k) + query(right, mid + 1, e, mid + 1, r, k);
- }
- }
- int main() {
- int n, q, l, r, k;
- scanf("%d", &n);
- for(int i = 1; i <= n; i++) scanf("%d", &arr[i]);
- build(1, 1, n);
- scanf("%d", &q);
- while(q--) {
- scanf("%d %d %d", &l, &r, &k);
- printf("%d\n", query(1, 1, n, l, r, k));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment