Advertisement
ivnikkk

Untitled

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