Advertisement
_ash__

Untitled

Dec 10th, 2020
787
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define Gene template< class
  5. #define Rics printer& operator,
  6. Gene c> struct rge{c b, e;};
  7. Gene c> rge<c> range(c i, c j){ return {i, j};}
  8. struct printer{
  9.     ~printer(){cerr<<endl;}
  10.     Gene c >Rics(c x){ cerr<<boolalpha<<x; return *this;}
  11.     Rics(string x){cerr<<x;return *this;}
  12.     Gene c, class d >Rics(pair<c, d> x){ return *this,"(",x.first,", ",x.second,")";}
  13.     Gene ... d, Gene ...> class c >Rics(c<d...> x){ return *this, range(begin(x), end(x));}
  14.     Gene c >Rics(rge<c> x){
  15.         *this,"["; for(auto it = x.b; it != x.e; ++it)
  16.             *this,(it==x.b?"":", "),*it; return *this,"]";}
  17. };
  18. #define debug() cerr<<"LINE "<<__LINE__<<" >> ", printer()
  19. #define dbg(x) "[",#x,": ",(x),"] "
  20. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  21. int my_rand(int l, int r) {
  22.     return uniform_int_distribution<int>(l, r) (rng);
  23. }
  24.  
  25. const int B = 500;
  26. const int N = 2e5+100;
  27. const int MX = 1e5+10;
  28.  
  29. struct Query {
  30.     int l1, r1, l2, r2;
  31. };
  32.  
  33. long long brokenSolve(vector<int>&a, vector<vector<int>>&occ, int l1, int r1, int l2, int r2) {
  34.     long long ans = 0;
  35.     for(int i = l1; i <= r1; i++) {
  36.         int cnt = upper_bound(occ[a[i]].begin(), occ[a[i]].end(), r2) - lower_bound(occ[a[i]].begin(), occ[a[i]].end(), l2);
  37.         ans += cnt;
  38.     }
  39.     return ans;
  40. }
  41.  
  42. int main() {
  43. //    freopen("in.txt", "r", stdin);
  44.     ios::sync_with_stdio(0);
  45.     cin.tie(0);
  46.  
  47.     int n, q;
  48.     cin >> n >> q;
  49.     vector<int> a(n);
  50.     vector<vector<int>> occ(MX);
  51.     for(int i = 0; i < n; i++) {
  52.         cin >> a[i];
  53.         occ[a[i]].push_back(i);
  54.     }
  55.     vector<Query> queries(q);
  56.     for(int i = 0; i < q; i++) {
  57.         cin >> queries[i].l1 >> queries[i].r1 >> queries[i].l2 >> queries[i].r2;
  58.         queries[i].l1--;
  59.         queries[i].r1--;
  60.         queries[i].l2--;
  61.         queries[i].r2--;
  62.     }
  63.     vector<long long> ans(q);
  64.     for(int l = 0; l < n; l += B) {
  65.         int r = l+B-1;
  66.         if(r >= n) break;
  67. //        debug(), dbg(l), dbg(r);
  68.         vector<int> cnt(MX);
  69.         for(int i = l; i <= r; i++) cnt[a[i]]++;
  70.         vector<long long> pref(n);
  71.         for(int i = 0; i < n; i++) pref[i] = (i>0 ? pref[i-1]:0) + cnt[a[i]];
  72.         for(int i = 0; i < q; i++) {
  73.             if(queries[i].l1 <= l && queries[i].r1 >= r) {
  74.                 ans[i] += pref[queries[i].r2] - (queries[i].l2 > 0 ? pref[queries[i].l2-1] : 0);
  75.             }
  76.         }
  77.     }
  78. //    for(int i = 0; i < q; i++) {
  79. //        cout << ans[i] << "\n";
  80. //    }
  81.     for(int i = 0; i < q; i++) {
  82.         int lb = queries[i].l1/B, rb = queries[i].r1/B;
  83.         if(lb == rb) {
  84.             if(queries[i].r1-queries[i].l1+1 < B) {
  85.                 ans[i] += brokenSolve(a, occ, queries[i].l1, queries[i].r1, queries[i].l2, queries[i].r2);
  86.             }
  87.         }
  88.         else {
  89.             if(queries[i].l1%B > 0) ans[i] += brokenSolve(a, occ, queries[i].l1,(lb+1)*B-1, queries[i].l2, queries[i].r2);
  90.             if((queries[i].r1+1)%B > 0) ans[i] += brokenSolve(a, occ, rb*B, queries[i].r1, queries[i].l2, queries[i].r2);
  91.         }
  92.     }
  93.     for(int i = 0; i < q; i++) cout << ans[i] << '\n';
  94. }
  95.  
  96.  
  97.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement