Iamtui1010

kquery

Dec 16th, 2021
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<cstdlib>
  4. #include<algorithm>
  5.  
  6. #define long long long
  7. #define nln '\n'
  8.  
  9. struct query
  10. {
  11.     long k, l, r;
  12.     query(long tek, long tel, long ter)
  13.     {
  14.         k = tek;
  15.         l = tel;
  16.         r = ter;
  17.     }
  18. };
  19.  
  20. using namespace std;
  21.  
  22. bool operator < (const query &a, const query &b)
  23. {
  24.     return a.k < b.k;
  25. }
  26.  
  27. vector<query> queries;
  28. vector<long> a, smt;
  29. long n, q;
  30.  
  31. void build(long id, long lef, long rig)
  32. {
  33.     if (lef == rig)
  34.     {
  35.         smt[id] = 1;
  36.         return;
  37.     }
  38.     long mid = (lef+rig)/2;
  39.     build(id*2, lef, mid);
  40.     build(id*2+1, mid+1, rig);
  41.     smt[id] = smt[id*2] + smt[id*2+1];
  42. }
  43.  
  44. void update(long id, long l, long r, long lef, long rig)
  45. {
  46.     if (l > rig || r < lef)
  47.         return;
  48.     if (l == r)
  49.     {
  50.         smt[id] = 0;
  51.         return;
  52.     }
  53.     long m = (l+r)/2;
  54.     update(id*2, l, m, lef, rig);
  55.     update(id*2, m+1, r, lef, rig);
  56.     smt[id] = smt[id*2] + smt[id*2+1];
  57. }
  58.  
  59. long get(long id, long l, long r, long lef, long rig)
  60. {
  61.     if (l > rig || r < lef)
  62.         return 0;
  63.     if (l >= lef && r <= rig)
  64.         return smt[id];
  65.     long m = (l+r)/2;
  66.     return get(id*2, l, m, lef, rig) + get(id*2+1, m+1, r, lef, rig);
  67. }
  68.  
  69. int main()
  70. {
  71.     // Input and sort
  72.     freopen("kquery.inp", "r", stdin);
  73.     cin >> n;
  74.     vector<pair<long, long>> tea(n);
  75.     a.resize(n);
  76.     for (long i = 0; i < n; ++i)
  77.     {
  78.         cin >> a[i];
  79.         tea[i].first = a[i];
  80.         tea[i].second = i;
  81.     }
  82.     sort(tea.begin(), tea.end());
  83.     vector<long> id(n);
  84.     for (long i = 0; i < n; ++i)
  85.         id[i] = tea[i].second;
  86.     cin >> q;
  87.     queries.resize(q, query(0, 0, 0));
  88.     for (auto &i : queries)
  89.         cin >> i.k >> i.l >> i.r;
  90.     sort(queries.begin(), queries.end());
  91.     // Segment Tree
  92.     smt.resize(4*n+2, 0);
  93.     build(1, 0 , n-1);
  94.     long i = 0;
  95.     for (auto qst : queries)
  96.     {
  97.         while (a[id[i]] <= qst.k)
  98.         {
  99.             update(1, 0, n-1, id[i]-1, id[i]-1);
  100.             ++i;
  101.         }
  102.         cout  << "k: " << qst.k << nln;
  103.         cout << get(1, 0, n-1, qst.l-1, qst.r-1) << nln;
  104.     }
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment