Advertisement
ivnikkk

Untitled

Jan 2nd, 2022
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.29 KB | None | 0 0
  1. #pragma GCC optimize("O3")
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include "bits/stdc++.h"
  4. using namespace std;
  5. typedef unsigned int ui;
  6. typedef long long             ll;
  7. typedef unsigned long long     ull;
  8. typedef long double            ld;
  9. #define endl              "\n"
  10. #define all(a)            a.begin(), a.end()
  11. #define allr(a)           a.rbegin(), a.rend()
  12. #define pb                push_back
  13. #define pikachu           push_back
  14. #define F                 first
  15. #define S                 second
  16. struct node {
  17.     ll mx, sum;
  18. };
  19. struct segtree {
  20.     node main_val, used_val;
  21. };
  22. const ll MAXN = 2e5 + 1;
  23. segtree tree[4 * MAXN]; ll a[MAXN];
  24. void build(ll v, ll tl, ll tr) {
  25.     if (tl == tr) {
  26.         tree[v].main_val = { a[tl],a[tl] };
  27.         tree[v].used_val = { a[tl],a[tl] };
  28.         return;
  29.     }
  30.     ll mid = (tr + tl) / 2;
  31.     build(v * 2, tl, mid);
  32.     build(v * 2 + 1, mid + 1, tr);
  33.     tree[v].main_val = { max(tree[v * 2].main_val.mx,tree[v * 2 + 1].main_val.mx),tree[v * 2].main_val.sum + tree[v * 2 + 1].main_val.sum };
  34.     tree[v].used_val = { max(tree[v * 2].used_val.mx,tree[v * 2 + 1].used_val.mx),tree[v * 2].used_val.sum + tree[v * 2 + 1].used_val.sum };
  35. }
  36. void update(ll v, ll tl, ll tr, ll l, ll r, ll mod) {
  37.     if (tl > r || tr < l) {
  38.         return;
  39.     }
  40.     if (tree[v].main_val.mx < mod) {
  41.         tree[v].used_val.mx = tree[v].main_val.mx;
  42.         tree[v].used_val.sum = tree[v].main_val.sum;
  43.         return;
  44.     }
  45.     if (tl == tr) {
  46.         tree[v].used_val.mx = tree[v].main_val.mx % mod;
  47.         tree[v].used_val.sum = tree[v].used_val.mx;
  48.         return;
  49.     }
  50.     ll mid = (tr + tl) / 2;
  51.     update(v * 2, tl, mid, l, r, mod);
  52.     update(v * 2 + 1, mid + 1, tr, l, r, mod);
  53.     tree[v].used_val = { max(tree[v * 2].used_val.mx,tree[v * 2 + 1].used_val.mx),tree[v * 2].used_val.sum + tree[v * 2 + 1].used_val.sum };
  54. }
  55. ll get_sum(ll v, ll tl, ll tr, ll l, ll r, ll mod) {
  56.     if (tl > r || tr < l) {
  57.         return 0;
  58.     }
  59.     if (tl >= l && tr <= r) {
  60.         if (tree[v].main_val.mx < mod) {
  61.             return tree[v].main_val.sum;
  62.         }
  63.         return tree[v].used_val.sum;
  64.     }
  65.     ll mid = (tr + tl) / 2;
  66.     return get_sum(v * 2, tl, mid, l, r, mod) +
  67.         get_sum(v * 2 + 1, mid + 1, tr, l, r, mod);
  68. }
  69. struct question {
  70.     ll l, r, x;
  71.     ll ind;
  72. };
  73. struct Line {
  74.     ll l, r;
  75. };
  76. unordered_map <ll, vector<question>> compres;
  77. vector<Line> Scanline(vector<question>& sub) {
  78.     struct event {
  79.         ll x, type;
  80.     };
  81.     vector<event> scan;
  82.     for (question& i : sub) {
  83.         scan.push_back({ i.l,+1 });
  84.         scan.push_back({ i.r,-1 });
  85.     }
  86.     sort(all(scan), [](event lht, event rht) {
  87.         return (lht.x < rht.x || (lht.x == rht.x && lht.type > rht.type));
  88.         });
  89.     vector<Line> coordinates_to_update;
  90.     ll l = -1, r = -1;
  91.     ll balance = 0;
  92.     for (event& i : scan) {
  93.         if (!balance) {
  94.             l = i.x;
  95.         }
  96.         else if (balance + i.type == 0) {
  97.             r = i.x;
  98.             coordinates_to_update.push_back({ l,r });
  99.         }
  100.         balance += i.type;
  101.     }
  102.     return coordinates_to_update;
  103. }
  104. void solve() {
  105.     ll n, m;
  106.     cin >> n >> m;
  107.     for (ll i = 0; i < n; i++) {
  108.         cin >> a[i];
  109.     }
  110.     build(1, 0, n - 1);
  111.     vector<ll> ans(m);
  112.     vector<question>q(m);
  113.     for (ll i = 0; i < m; i++) {
  114.         ll l, r, x;
  115.         cin >> l >> r >> x;
  116.         q[i] = { --l,--r, x ,i };
  117.     }
  118.     auto cmp = [&](question lht, question rht) {
  119.         return lht.x < rht.x;
  120.     };
  121.     sort(all(q), cmp);
  122.     for (question& i : q) {
  123.         compres[i.x].push_back(i);
  124.     }
  125.     ll cnt = 0;
  126.     // lst last = { -1,-1,-1 };
  127.     for (auto& i : compres) {
  128.         vector<Line> upd = Scanline(i.second);
  129.         for (auto&& [l, r] : upd) {
  130.             update(1, 0, n - 1, l, r, i.first);
  131.         }
  132.         for (question j : i.second) {
  133.             ans[j.ind] = get_sum(1, 0, n - 1, j.l, j.r, i.first);
  134.         }
  135.     }
  136.     for (ll i = 0; i < m; i++) {
  137.         cout << ans[i] << endl;
  138.     }
  139. }
  140. signed main() {
  141. #ifdef _DEBUG
  142.     freopen("input.txt", "r", stdin);
  143.     freopen("output.txt", "w", stdout);
  144. #endif
  145.     ios_base::sync_with_stdio(false);
  146.     cin.tie(nullptr);
  147.     ll t = 1;
  148.     //cin >> t;
  149.     while (t--) {
  150.         solve();
  151.     }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement