Advertisement
ivnikkk

Untitled

Aug 3rd, 2022
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <iomanip>
  6. #include <fstream>
  7. #include <string>
  8. #include <set>
  9. #include <deque>
  10. #include <queue>
  11. #include <map>
  12. #include <bitset>
  13. #include <random>
  14. #include <cassert>
  15. #include <unordered_map>
  16. #include <unordered_set>
  17. #include <math.h>
  18. #include <cstdlib>
  19. using namespace std;
  20. #define all(a)            a.begin(), a.end()
  21. #define lf '\n'
  22. typedef int ll;
  23. typedef long long ll2;
  24. typedef pair<ll, ll> pll;
  25. const ll inf = 1e9;
  26. vector<vector<ll>> vals;
  27. unordered_map<ll, vector<ll2>> prefs;
  28. size_t n, m;
  29. vector <ll> a;
  30.  
  31. void build(size_t v, size_t tl, size_t tr) {
  32.     if (tl == tr) {
  33.         vals[v] = vector<ll>(1, a[tl]);
  34.     }
  35.     else {
  36.         size_t tm = (tl + tr) >> 1;
  37.         size_t left = (v << 1);
  38.         size_t right = left | 1;
  39.         build(left, tl, tm);
  40.         build(right, tm + 1, tr);
  41.         merge(vals[left].begin(), vals[left].end(), vals[right].begin(), vals[right].end(), back_inserter(vals[v]));
  42.         ll sum = 0;/*
  43.         for (size_t i = 0; i < vals[v].size(); ++i) {
  44.             sum += vals[v][i];
  45.             prefs[v][i] = sum;
  46.         }*/
  47.     }
  48. }
  49. unordered_map <ll, ll2> save;
  50. ll2 sum_seg(vector<ll>& v, vector<ll2>& p, ll cur, ll mod) {
  51.     ll2 res = 0;
  52.     if (v.size() == 0)
  53.         return res;
  54.  
  55.     if (save.find(cur) != save.end())
  56.         return save[cur];
  57.  
  58.     auto beg = v.begin();
  59.     ll2 mx = *(v.rbegin());
  60.     ll kmax = mx / mod;
  61.  
  62.     while (beg != v.end()) {
  63.         ll2 mn = *beg;
  64.         ll2 cnt = distance(beg, v.end());
  65.         ll2 idx = distance(v.begin(), beg);
  66.         if (mn == mx) {
  67.             res += (ll2)(mn % mod) * cnt;
  68.             break;
  69.         }
  70.         ll kmin = mn / mod;
  71.         if (kmin == kmax) {
  72.             res += (ll2)(*(p.rbegin()) - (idx == 0 ? 0 : p[idx - 1])) - (ll2)mod * kmin * cnt;
  73.             break;
  74.         }
  75.         auto nxt = lower_bound(beg, v.end(), (kmin + 1) * mod);
  76.         auto prv = prev(nxt);
  77.         size_t idx2 = distance(v.begin(), prv);
  78.         ll2 cnt2 = distance(beg, nxt);
  79.         res += (ll2)(p[idx2] - (idx == 0 ? 0 : p[idx - 1])) - (ll2)mod * kmin * cnt2;
  80.  
  81.         beg = nxt;
  82.     }
  83.     save[cur] = res;
  84.     return res;
  85. }
  86.  
  87. ll2 sum(size_t v, size_t tl, size_t tr, size_t l, size_t r, ll mod) {
  88.     if (l > r)
  89.         return 0;
  90.  
  91.     if (l == tl && r == tr) {
  92.  
  93.         if (prefs[v].empty()) {
  94.             prefs[v].resize(vals[v].size());
  95.             ll2 sum = 0;
  96.             for (size_t i = 0; i < vals[v].size(); ++i) {
  97.                 sum += vals[v][i];
  98.                 prefs[v][i] = sum;
  99.             }
  100.         }
  101.         return sum_seg(vals[v], prefs[v], v, mod);
  102.     }
  103.     size_t tm = (tl + tr) >> 1;
  104.     return sum(v << 1, tl, tm, l, min(r, tm), mod) + sum((v << 1) | 1, tm + 1, tr, max(l, tm + 1), r, mod);
  105. }
  106. const ll c = 3000;
  107. ll pref[c + 1];
  108. signed main() {
  109.     ll t = 1;
  110.     ios_base::sync_with_stdio(false);
  111.     cin.tie(nullptr);
  112.     //cin >> t;
  113.     while (t--) {
  114.         cin >> n >> m;
  115.         ll sub = 1;
  116.         while (sub < n)sub *= 2;
  117.         a.resize(sub * 2);
  118.         vals.resize(sub * 2);
  119.         ll i;
  120.         for (i = 0; i < n; ++i) {
  121.             cin >> a[i];
  122.         }
  123.  
  124.         vector<ll2> ans(m);
  125.         struct event {
  126.             ll x, type;
  127.             ll mod;
  128.             ll ind;
  129.         };
  130.         struct bigger {
  131.             ll l, r;
  132.             ll mod;
  133.             ll ind;
  134.         };
  135.         vector<event> line;
  136.         vector<bigger> big_sqrt;
  137.         for (i = 0; i < m; ++i) {
  138.             ll l, r, mod;
  139.             cin >> l >> r >> mod;
  140.             --l, --r;
  141.             if (mod <= c) {
  142.                 line.push_back({ l, 1, mod, i });
  143.                 line.push_back({ r, -1, mod, i });
  144.             }
  145.             else {
  146.                 big_sqrt.push_back({ l,r,mod,i });
  147.             }
  148.         }
  149.         auto cmp = [&](event& lht, event& rht) {
  150.             if (lht.x == rht.x) {
  151.                 return lht.type > rht.type;
  152.             }
  153.             return lht.x < rht.x;
  154.         };
  155.         sort(all(line), cmp);
  156.         ll ind = 0;
  157.         for (int i = 0; i <= c; i++)
  158.             pref[i] = 0;
  159.         for (event& i : line) {
  160.             while (ind < i.x) {
  161.                 for (ll j = 1; j <= c; j++) {
  162.                     pref[j] += (a[ind]) % j;
  163.                 }
  164.                 ind++;
  165.             }
  166.             if (i.type == 1) {
  167.                 ans[i.ind] = -pref[i.mod];
  168.             }
  169.             else {
  170.                 ans[i.ind] += (ll2)pref[i.mod] + (ll2)a[ind] % i.mod;
  171.             }
  172.         }
  173.         build(1, 0, n - 1);
  174.         //ll sss = 0;
  175.         ll last = -inf;
  176.         for (bigger& i : big_sqrt) {
  177.             if (last != i.mod && last != -inf) {
  178.                 save.clear();
  179.             }
  180.             last = i.mod;
  181.             ll ql = i.l, qr = i.r, modd = i.mod, to = i.ind;
  182.             ans[to] = sum(1, 0, n - 1, ql, qr, modd);
  183.         }
  184.         for (ll2& now : ans) {
  185.             cout << now << endl;
  186.         }
  187.         //cout << sss << endl;
  188.     }
  189.     return 0;
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement