Guest User

C

a guest
Jan 19th, 2026
407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct Fenwick {
  5.   int size;
  6.   vector<long long> bit;
  7.  
  8.   Fenwick() {}
  9.  
  10.   explicit Fenwick(int n) : size(n), bit(n + 1) {}
  11.  
  12.   void update(int i, long long value) {
  13.     for (++i; i <= size; i += i & -i) {
  14.       bit[i] += value;
  15.     }
  16.   }
  17.  
  18.   long long query(int r) {
  19.     long long result = 0;
  20.     for (; r > 0; r -= r & -r) {
  21.       result += bit[r];
  22.     }
  23.     return result;
  24.   }
  25. };
  26.  
  27. int main() {
  28.   ios_base::sync_with_stdio(false);
  29.   cin.tie(nullptr);
  30.   int n, q;
  31.   cin >> n >> q;
  32.   vector<int> a(n);
  33.   for (int &value : a) {
  34.     cin >> value;
  35.   }
  36.   vector<int> jl(n), jr(n);
  37.   for (int i = 0; i < n; i++) {
  38.     jl[i] = i - 1;
  39.     while (jl[i] != -1 && a[jl[i]] >= a[i]) {
  40.       jl[i] = jl[jl[i]];
  41.     }
  42.   }
  43.   for (int i = n - 1; i >= 0; i--) {
  44.     jr[i] = i + 1;
  45.     while (jr[i] != n && a[jr[i]] > a[i]) {
  46.       jr[i] = jr[jr[i]];
  47.     }
  48.   }
  49.   vector<array<int, 4>> queries;
  50.   for (int i = 0; i < q; i++) {
  51.     int l, r, k;
  52.     cin >> l >> r >> k;
  53.     --l;
  54.     queries.push_back({l, k, +1, i});
  55.     queries.push_back({r - k + 1, k, -1, i});
  56.   }
  57.   vector<long long> result(q);
  58.   // auto Query = [&](int start, int k) -> long long {
  59.   //   long long result = 0;
  60.   //   for (int i = 0; i < n; i++) {
  61.   //     int coeff = max(0, min(i + 1, jr[i] - k + 1) - max({jl[i] + 1, start, i + 1 - k}));
  62.   //     int my_coeff = 0;
  63.   //     if (k <= jr[i] - i) {
  64.   //       if (start <= jl[i] + 1 && k >= i - jl[i]) {
  65.   //         my_coeff = i - jl[i];
  66.   //       }
  67.   //       if (start > jl[i] + 1 && start + k >= i + 1 && start <= i + 1) {
  68.   //         my_coeff = i + 1 - start;
  69.   //       }
  70.   //       if (k < i - jl[i] && start + k < i + 1) {
  71.   //         my_coeff = k;
  72.   //       }
  73.   //     } else {
  74.   //       if (start <= jl[i] + 1 && k >= i - jl[i] && k <= jr[i] - jl[i]) {
  75.   //         my_coeff = jr[i] - jl[i] - k;
  76.   //       }
  77.   //       // if (start > jl[i] + 1 && start + k >= i + 1 && k <= jr[i] + 1 - start) {
  78.   //       //   my_coeff = (jr[i] - k + 1) - start;
  79.   //       // }
  80.   //       if (k < i - jl[i] && start + k < i + 1) {
  81.   //         my_coeff = jr[i] - i;
  82.   //       }
  83.   //     }
  84.   //     assert(my_coeff >= 0);
  85.   //     // assert(my_coeff == coeff);
  86.   //     result += 1LL * my_coeff * a[i];
  87.   //   }
  88.   //   return result;
  89.   // };
  90.   // vector<long long> result1(q);
  91.   // for (auto &[start, k, sign, ind] : queries) {
  92.   //   result1[ind] += sign * Query(start, k);
  93.   // }
  94.   // Case 1.1: k >= i - jl[i] && k <= jr[i] - i && start <= jl[i] + 1
  95.   // Add (i - jl[i]) * a[i]
  96.   {
  97.     using Event = tuple<int, int, int, int, long long>;
  98.     vector<Event> events;
  99.     for (int i = 0; i < n; i++) {
  100.       int l = i - jl[i], r = jr[i] - i;
  101.       if (l <= r) {
  102.         events.push_back({jl[i] + 1, 1, l, r, 1LL * (i - jl[i]) * a[i]});
  103.       }
  104.     }
  105.     for (int i = 0; i < queries.size(); i++) {
  106.       events.push_back({queries[i][0], 2, queries[i][1], queries[i][2], queries[i][3]});
  107.     }
  108.     sort(events.begin(), events.end(), [](const Event& a, const Event& b) {
  109.       auto &[xa, ta, y1a, y2a, valuea] = a;
  110.       auto &[xb, tb, y1b, y2b, valueb] = b;
  111.       return xa != xb ? xa > xb : ta < tb;
  112.     });
  113.     Fenwick bit(n + 1);
  114.     for (auto &[x, t, y1, y2, value] : events) {
  115.       if (t == 1) {
  116.         bit.update(y1, +value);
  117.         bit.update(y2 + 1, -value);
  118.       } else {
  119.         result[value] += y2 * bit.query(y1 + 1);
  120.       }
  121.     }
  122.   }
  123.   // Case 1.2. start >= jl[i] + 2 && start + k >= i + 1 && start <= i + 1 && k <= jr[i] - i
  124.   // Add (i + 1 - start) * a[i] = (i + 1) * a[i] - start * a[i]
  125.   {
  126.     using Event = tuple<int, int, int, int, int, long long>;
  127.     vector<Event> events;
  128.     for (int i = 0; i < n; i++) {
  129.       int l = jl[i] + 2, r = i + 1;
  130.       if (l <= r) {
  131.         events.push_back({jr[i] - i, -(i + 1), 1, l, r, i});
  132.       }
  133.     }
  134.     vector<long long> mlt1(queries.size()), mlt2(queries.size());
  135.     for (int i = 0; i < queries.size(); i++) {
  136.       events.push_back({queries[i][1], -(queries[i][0] + queries[i][1]), 2, queries[i][0], queries[i][2], i});
  137.     }
  138.     auto CmpLocal = [&](const Event& a, const Event& b) {
  139.       auto &[xa, ya, ta, z1a, z2a, inda] = a;
  140.       auto &[xb, yb, tb, z1b, z2b, indb] = b;
  141.       return ya != yb ? ya > yb : ta < tb;
  142.     };
  143.     sort(events.begin(), events.end(), [](const Event& a, const Event& b) {
  144.       auto &[xa, ya, ta, z1a, z2a, inda] = a;
  145.       auto &[xb, yb, tb, z1b, z2b, indb] = b;
  146.       return xa != xb ? xa > xb : ta < tb;
  147.     });
  148.     Fenwick bit1(n + 1), bit2(n + 1);
  149.     vector<Event> evs;
  150.     auto CDQ = [&](auto&& self, int low, int high) -> void {
  151.       if (high - low == 1) {
  152.         return;
  153.       }
  154.       int mid = (low + high) / 2;
  155.       self(self, low, mid);
  156.       self(self, mid, high);
  157.       for (int i = low; i < mid; i++) {
  158.         if (get<2>(events[i]) == 1) {
  159.           evs.push_back(events[i]);
  160.         }
  161.       }
  162.       int delta = evs.size();
  163.       for (int i = mid; i < high; i++) {
  164.         if (get<2>(events[i]) == 2) {
  165.           evs.push_back(events[i]);
  166.         }
  167.       }
  168.       inplace_merge(evs.begin(), evs.begin() + delta, evs.end(), CmpLocal);
  169.       for (auto &e : evs) {
  170.         auto [x, y, t, z1, z2, ind] = e;
  171.         if (t == 1) {
  172.           long long value1 = 1LL * (ind + 1) * a[ind], value2 = a[ind];
  173.           bit1.update(z1, +value1);
  174.           bit1.update(z2 + 1, -value1);
  175.           bit2.update(z1, +value2);
  176.           bit2.update(z2 + 1, -value2);
  177.         } else {
  178.           mlt1[ind] += z2 * bit1.query(z1 + 1);
  179.           mlt2[ind] += z2 * bit2.query(z1 + 1);
  180.         }
  181.       }
  182.       inplace_merge(events.begin() + low, events.begin() + mid, events.begin() + high, CmpLocal);
  183.       for (auto &e : evs) {
  184.         auto [x, y, t, z1, z2, ind] = e;
  185.         if (t == 1) {
  186.           long long value1 = 1LL * (ind + 1) * a[ind], value2 = a[ind];
  187.           bit1.update(z1, -value1);
  188.           bit1.update(z2 + 1, +value1);
  189.           bit2.update(z1, -value2);
  190.           bit2.update(z2 + 1, +value2);
  191.         }
  192.       }
  193.       evs.clear();
  194.     };
  195.     CDQ(CDQ, 0, events.size());
  196.     for (int i = 0; i < queries.size(); i++) {
  197.       result[i / 2] += mlt1[i] - queries[i][0] * mlt2[i];
  198.     }
  199.   }
  200.   // Case 1.3. k <= i - jl[i] - 1 && start + k <= i && k <= jr[i] - i
  201.   // Add k * a[i]
  202.   {
  203.     using Event = tuple<int, int, int, int, long long>;
  204.     vector<Event> events;
  205.     for (int i = 0; i < n; i++) {
  206.       int l = 0, r = min(i - jl[i] - 1, jr[i] - i);
  207.       if (l <= r) {
  208.         events.push_back({i, 1, l, r, a[i]});
  209.       }
  210.     }
  211.     for (int i = 0; i < queries.size(); i++) {
  212.       events.push_back({queries[i][0] + queries[i][1], 2, queries[i][1], queries[i][2], queries[i][3]});
  213.     }
  214.     sort(events.begin(), events.end(), [](const Event& a, const Event& b) {
  215.       auto &[xa, ta, y1a, y2a, valuea] = a;
  216.       auto &[xb, tb, y1b, y2b, valueb] = b;
  217.       return xa != xb ? xa > xb : ta < tb;
  218.     });
  219.     Fenwick bit(n + 1);
  220.     vector<long long> mlt(q);
  221.     for (auto &[x, t, y1, y2, value] : events) {
  222.       if (t == 1) {
  223.         bit.update(y1, +value);
  224.         bit.update(y2 + 1, -value);
  225.       } else {
  226.         mlt[value] += y2 * bit.query(y1 + 1);
  227.       }
  228.     }
  229.     for (int i = 0; i < q; i++) {
  230.       result[i] += mlt[i] * queries[i * 2][1];
  231.     }
  232.   }
  233.   // Case 2.1: start <= jl[i] + 1 && k >= i - jl[i] && k <= jr[i] - jl[i] && k > jr[i] - i
  234.   // (jr[i] - jl[i] - k) * a[i]
  235.   // (jr[i] - jl[i]) * a[i]
  236.   // -k * a[i]
  237.   /*
  238.         if (start <= jl[i] + 1 && k >= i - jl[i] && k <= jr[i] - jl[i]) {
  239.           my_coeff = jr[i] - jl[i] - k;
  240.         }
  241.   */
  242.   {
  243.     using Event = tuple<int, int, int, int, long long>;
  244.     vector<Event> events;
  245.     for (int i = 0; i < n; i++) {
  246.       int l = max(i - jl[i], jr[i] - i + 1), r = jr[i] - jl[i];
  247.       if (l <= r) {
  248.         events.push_back({jl[i] + 1, 1, l, r, i});
  249.       }
  250.     }
  251.     for (int i = 0; i < queries.size(); i++) {
  252.       events.push_back({queries[i][0], 2, queries[i][1], queries[i][2], queries[i][3]});
  253.     }
  254.     sort(events.begin(), events.end(), [](const Event& a, const Event& b) {
  255.       auto &[xa, ta, y1a, y2a, valuea] = a;
  256.       auto &[xb, tb, y1b, y2b, valueb] = b;
  257.       return xa != xb ? xa > xb : ta < tb;
  258.     });
  259.     Fenwick bit1(n + 1), bit2(n + 1);
  260.     vector<long long> mlt1(q), mlt2(q);
  261.     for (auto &[x, t, y1, y2, value] : events) {
  262.       if (t == 1) {
  263.         long long value1 = 1LL * (jr[value] - jl[value]) * a[value], value2 = a[value];
  264.         bit1.update(y1, +value1);
  265.         bit1.update(y2 + 1, -value1);
  266.         bit2.update(y1, +value2);
  267.         bit2.update(y2 + 1, -value2);
  268.       } else {
  269.         mlt1[value] += y2 * bit1.query(y1 + 1);
  270.         mlt2[value] += y2 * bit2.query(y1 + 1);
  271.       }
  272.     }
  273.     for (int i = 0; i < q; i++) {
  274.       result[i] += mlt1[i] - mlt2[i] * queries[i * 2][1];
  275.     }
  276.   }
  277.   // Case 2.2: start > jl[i] + 1 && start + k >= i + 1 && start + k <= jr[i] + 1 && k > jr[i] - i
  278.   // Add (jr[i] - k + 1 - start) * a[i] = (jr[i] + 1) * a[i] - (k + start) * a[i]
  279.     {
  280.     using Event = tuple<int, int, int, int, int, long long>;
  281.     vector<Event> events;
  282.     for (int i = 0; i < n; i++) {
  283.       int l = i + 1, r = jr[i] + 1;
  284.       if (l <= r) {
  285.         events.push_back({-(jl[i] + 2), -(jr[i] - i + 1), 1, l, r, i});
  286.       }
  287.     }
  288.     vector<long long> mlt1(queries.size()), mlt2(queries.size());
  289.     for (int i = 0; i < queries.size(); i++) {
  290.       events.push_back({-queries[i][0], -queries[i][1], 2, queries[i][0] + queries[i][1], queries[i][2], i});
  291.     }
  292.     auto CmpLocal = [&](const Event& a, const Event& b) {
  293.       auto &[xa, ya, ta, z1a, z2a, inda] = a;
  294.       auto &[xb, yb, tb, z1b, z2b, indb] = b;
  295.       return ya != yb ? ya > yb : ta < tb;
  296.     };
  297.     sort(events.begin(), events.end(), [](const Event& a, const Event& b) {
  298.       auto &[xa, ya, ta, z1a, z2a, inda] = a;
  299.       auto &[xb, yb, tb, z1b, z2b, indb] = b;
  300.       return xa != xb ? xa > xb : ta < tb;
  301.     });
  302.     Fenwick bit1(2 * n + 1), bit2(2 * n + 1);
  303.     vector<Event> evs;
  304.     auto CDQ = [&](auto&& self, int low, int high) -> void {
  305.       if (high - low == 1) {
  306.         return;
  307.       }
  308.       int mid = (low + high) / 2;
  309.       self(self, low, mid);
  310.       self(self, mid, high);
  311.       for (int i = low; i < mid; i++) {
  312.         if (get<2>(events[i]) == 1) {
  313.           evs.push_back(events[i]);
  314.         }
  315.       }
  316.       int delta = evs.size();
  317.       for (int i = mid; i < high; i++) {
  318.         if (get<2>(events[i]) == 2) {
  319.           evs.push_back(events[i]);
  320.         }
  321.       }
  322.       inplace_merge(evs.begin(), evs.begin() + delta, evs.end(), CmpLocal);
  323.       for (auto &e : evs) {
  324.         auto &[x, y, t, z1, z2, ind] = e;
  325.         if (t == 1) {
  326.           long long value1 = 1LL * (jr[ind] + 1) * a[ind], value2 = a[ind];
  327.           bit1.update(z1, +value1);
  328.           bit1.update(z2 + 1, -value1);
  329.           bit2.update(z1, +value2);
  330.           bit2.update(z2 + 1, -value2);
  331.         } else {
  332.           mlt1[ind] += z2 * bit1.query(z1 + 1);
  333.           mlt2[ind] += z2 * bit2.query(z1 + 1);
  334.         }
  335.       }
  336.       inplace_merge(events.begin() + low, events.begin() + mid, events.begin() + high, CmpLocal);
  337.       for (auto &e : evs) {
  338.         auto &[x, y, t, z1, z2, ind] = e;
  339.         if (t == 1) {
  340.           long long value1 = 1LL * (jr[ind] + 1) * a[ind], value2 = a[ind];
  341.           bit1.update(z1, -value1);
  342.           bit1.update(z2 + 1, +value1);
  343.           bit2.update(z1, -value2);
  344.           bit2.update(z2 + 1, +value2);
  345.         }
  346.       }
  347.       evs.clear();
  348.     };
  349.     CDQ(CDQ, 0, events.size());
  350.     for (int i = 0; i < queries.size(); i++) {
  351.       result[i / 2] += mlt1[i] - (queries[i][0] + queries[i][1]) * mlt2[i];
  352.     }
  353.   }
  354.   // Case 2.3: i + 1 - k > jl[i] + 1 && i + 1 - k > start
  355.   // <=> k < i - jl[i] && start + k < i + 1 <=> start + k <= i && k > jr[i] - i
  356.   // Add (jr[i] - i) * a[i]
  357.   {
  358.     using Event = tuple<int, int, int, int, long long>;
  359.     vector<Event> events;
  360.     for (int i = 0; i < n; i++) {
  361.       int l = jr[i] - i + 1, r = i - jl[i] - 1;
  362.       if (l <= r) {
  363.         events.push_back({i, 1, l, r, 1LL * (jr[i] - i) * a[i]});
  364.       }
  365.     }
  366.     for (int i = 0; i < queries.size(); i++) {
  367.       events.push_back({queries[i][0] + queries[i][1], 2, queries[i][1], queries[i][2], queries[i][3]});
  368.     }
  369.     sort(events.begin(), events.end(), [](const Event& a, const Event& b) {
  370.       auto &[xa, ta, y1a, y2a, valuea] = a;
  371.       auto &[xb, tb, y1b, y2b, valueb] = b;
  372.       return xa != xb ? xa > xb : ta < tb;
  373.     });
  374.     Fenwick bit(n + 1);
  375.     for (auto &[x, t, y1, y2, value] : events) {
  376.       if (t == 1) {
  377.         bit.update(y1, +value);
  378.         bit.update(y2 + 1, -value);
  379.       } else {
  380.         result[value] += y2 * bit.query(y1 + 1);
  381.       }
  382.     }
  383.   }
  384.   for (auto value : result) {
  385.     cout << value << "\n";
  386.   }
  387. }
Advertisement
Add Comment
Please, Sign In to add comment