ahmrf

Untitled

Oct 19th, 2015
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.50 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MAX = 100005;
  6.  
  7. vector<int> tree[3 * MAX];
  8. int arr[MAX];
  9.  
  10. vector<int> merge(vector<int> left, vector<int> right) {
  11.     int ls = left.size(), rs = right.size();
  12.     vector<int> par(ls + rs);
  13.     int i = 0, j = 0, k = 0;
  14.     while(i < ls && j < rs) {
  15.         if(left[i] < right[j]) par[k++] = left[i++];
  16.         else par[k++] = right[j++];
  17.     }
  18.     while(i < ls) {
  19.         par[k++] = left[i++];
  20.     }
  21.     while(j < rs) {
  22.         par[k++] = right[j++];
  23.     }
  24.     return par;
  25. }
  26.  
  27. void build(int node, int s, int e) {
  28.     if(s == e) {
  29.         tree[node].push_back(arr[s]);
  30.         return ;
  31.     }
  32.  
  33.     int left = node << 1, right = left + 1, mid = (s + e) >> 1;
  34.     build(left, s, mid);
  35.     build(right, mid + 1, e);
  36.     tree[node] = merge(tree[left], tree[right]);
  37. }
  38.  
  39. int query(int node, int s, int e, int l, int r, int k) {
  40.     if(s == l && e == r) {
  41.         int id = (int)(upper_bound(tree[node].begin(), tree[node].end(), k) - tree[node].begin());
  42.         return tree[node].size() - id;
  43.     }
  44.  
  45.     int left = node << 1, right = left + 1, mid = (s + e) >> 1;
  46.     if(r <= mid) {
  47.         return query(left, s, mid, l, r, k);
  48.     } else if(mid < l) {
  49.         return query(right, mid + 1, e, l, r, k);
  50.     } else {
  51.         return query(left, s, mid, l, mid, k) + query(right, mid + 1, e, mid + 1, r, k);
  52.     }
  53. }
  54.  
  55.  
  56. int main() {
  57.     int n, q, l, r, k;
  58.     scanf("%d", &n);
  59.     for(int i = 1; i <= n; i++) scanf("%d", &arr[i]);
  60.     build(1, 1, n);
  61.     scanf("%d", &q);
  62.     while(q--) {
  63.         scanf("%d %d %d", &l, &r, &k);
  64.         printf("%d\n", query(1, 1, n, l, r, k));
  65.     }
  66.  
  67.     return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment