Guest User

Untitled

a guest
Jun 12th, 2017
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define F first
  6. #define S second
  7.  
  8. vector<int> a, b;
  9.  
  10. template<class T>
  11. struct segtree{ // [l,r)
  12.     int n;
  13.     vector<vector<T>> sum, all;
  14.     segtree(int sz){
  15.         n = (1 << ((int)(log2(sz - 1)) + 1));
  16.         sum.resize(n + n);
  17.         all.resize(n + n);
  18.     }
  19.     void build(int root, int l, int r){
  20.         if (l >= r) return;
  21.         if (l >= a.size()) return;
  22.         if (l + 1 == r){
  23.             all[root].push_back(a[l]);
  24.             sum[root].push_back(a[l]);
  25.             return;
  26.         }
  27.         int mid = (l + r) >> 1;
  28.         build(root<<1, l, mid);
  29.         build(root<<1|1, mid, r);
  30.         all[root].resize(all[root<<1].size() + all[root<<1|1].size());
  31.         merge(all[root<<1].begin(), all[root<<1].end(), all[root<<1|1].begin(), all[root<<1|1].end(), all[root].begin());
  32.         sum[root].resize(all[root<<1].size() + all[root<<1|1].size());
  33.         for (int i = 0; i < sum[root].size(); i++)
  34.             sum[root][i] = all[root][i] + (i == 0 ? 0 : sum[root][i - 1]);
  35.     }
  36.     int find_cnt(int x, int y, T val, int root, int l, int r){
  37.         if (r <= x || l >= y) return 0;
  38.         if (l >= x && r <= y){
  39.             int p = (int)(upper_bound(all[root].begin(), all[root].end(), val) - all[root].begin());
  40.             return p;
  41.         }
  42.         int mid = (l + r) >> 1;
  43.         return find_cnt(x, y, val, root<<1, l, mid) + find_cnt(x, y, val, root<<1|1, mid, r);
  44.     }
  45.     int find_cnt(int x, int y, T val){
  46.         return find_cnt(x, y, val, 1, 0, n);
  47.     }
  48.     T find_sum(int x, int y, T val, int root, int l, int r){
  49.         if (r <= x || l >= y) return 0;
  50.         if (l >= x && r <= y){
  51.             int p = (int)(upper_bound(all[root].begin(), all[root].end(), val) - all[root].begin());
  52.             return (p == 0 ? 0 : sum[root][p - 1]);
  53.         }
  54.         int mid = (l + r) >> 1;
  55.         return find_sum(x, y, val, root<<1, l, mid) + find_sum(x, y, val, root<<1|1, mid, r);
  56.     }
  57.     T find_sum(int x, int y, T val){
  58.         return find_sum(x, y, val, 1, 0, n);
  59.     }
  60. };
  61.  
  62. long long brute(int l, int r, int k){
  63.     vector<int> cur;
  64.     for (int i = l; i <= r; i++) cur.push_back(a[i]);
  65.     sort(cur.begin(), cur.end());
  66.     long long ans = 0;
  67.     for (int i = 0; i < k; i++) ans += cur[i];
  68.     return ans;
  69. }
  70.  
  71. int main() {
  72.     ios_base::sync_with_stdio(0);
  73.     freopen("input.txt", "r", stdin);
  74.  
  75.     int n;
  76.     cin >> n;
  77.     a.resize(n);
  78.     for (int i = 0; i < n; i++) cin >> a[i];
  79.     b = a;
  80.     sort(b.begin(), b.end());
  81.     segtree<long long> T(n);
  82.     T.build(1, 0, T.n); // [l,r)
  83.  
  84.     int q;
  85.     cin >> q;
  86.     while (q--){
  87.         int l, r, k;
  88.         cin >> l >> r >> k;
  89.  
  90.         int L = 0, R = n - 1, x, cnt;
  91.         while (L <= R){
  92.             int mid = (L + R) >> 1;
  93.             int cur = T.find_cnt(l, r + 1, b[mid]);
  94.             if (cur >= k){
  95.                 cnt = cur;
  96.                 x = b[mid];
  97.                 R = mid - 1;
  98.             }
  99.             else{
  100.                 L = mid + 1;
  101.             }
  102.         }
  103.  
  104.         long long ans = T.find_sum(l, r + 1, x);
  105.         ans -= 1ll * x * (cnt - k);
  106.         cout << ans << endl;
  107.     }
  108.     return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment