Advertisement
ivnikkk

Untitled

Jan 10th, 2023
554
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.27 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "bits/stdc++.h"
  3. using namespace std;
  4. #define all(a) a.begin(), a.end()
  5. #define int long long
  6. const int c = 500, mod = 1e9 + 7;
  7.  
  8. inline int gilbertOrder(int x, int y, int pow, int rotate) {
  9.     if (pow == 0) {
  10.         return 0;
  11.     }
  12.     int hpow = 1ll << (pow - 1);
  13.     int seg = (x < hpow) ? ( (y < hpow) ? 0 : 3) : ((y < hpow) ? 1 : 2);
  14.     seg = (seg + rotate) & 3;
  15.     const int rotateDelta[4] = { 3, 0, 0, 1 };
  16.     int nx = x & (x ^ hpow), ny = y & (y ^ hpow);
  17.     int nrot = (rotate + rotateDelta[seg]) & 3;
  18.     int subSquareSize = 1ll << (2 * pow - 2);
  19.     int ans = seg * subSquareSize;
  20.     int add = gilbertOrder(nx, ny, pow - 1, nrot);
  21.     ans += (seg == 1 || seg == 2) ? add : (subSquareSize - add - 1);
  22.     return ans;
  23. }
  24.  
  25. struct Query {
  26.     int l, r, ind, ord;
  27.     Query(int _l, int _r, int _i) : l(_l), r(_r), ind(_i) {
  28.         ord = gilbertOrder(l, r, 21, 0);
  29.     };
  30.     bool operator<(const Query& other) {
  31.         return ord < other.ord;
  32.     }
  33. };
  34. struct Fenwick {
  35.     int n;
  36.     vector<int> t;
  37.     Fenwick(int _n) : n(_n) {
  38.         t.resize(_n + 1);
  39.     }
  40.     void upd(int i, int x) {
  41.         for (; i <= n; i += i & -i) {
  42.             t[i] += x;
  43.             t[i] = (t[i] + mod) % mod;
  44.         }
  45.     }
  46.     int get(int i) {
  47.         int res = 0;
  48.         for (; i; i -= i & -i) {
  49.             res = (res + t[i]) % mod;
  50.         }
  51.         return res;
  52.     }
  53.     int sum(int l, int r) {
  54.         return (get(r) - get(l - 1) + mod) % mod;;
  55.     }
  56. };
  57. int binpow(int a, int n) {
  58.     int res = 1;
  59.     while (n) {
  60.         if (n & 1) {
  61.             res = (res * a) % mod;
  62.         }
  63.         a = (a * a) % mod;
  64.         n /= 2;
  65.     }
  66.     return res;
  67. }
  68. int inv(int x) {
  69.     return binpow(x, mod - 2);
  70. }
  71. signed main() {
  72. #ifdef _DEBUG
  73.     freopen("input.txt", "r", stdin);
  74.     freopen("output.txt", "w", stdout);
  75. #endif
  76.     ios_base::sync_with_stdio(false);
  77.     cin.tie(nullptr);
  78.     int div = inv(2);
  79.     int n, q; cin >> n >> q;
  80.     vector<int> a(n), pref(n + 1);
  81.     for (int i = 0; i < n; i++) {
  82.         cin >> a[i];
  83.         pref[i + 1] = pref[i] + a[i];
  84.         pref[i + 1] %= mod;
  85.     }
  86.     auto get_sum = [&](int l, int r) {
  87.         return (pref[r + 1] - pref[l] + mod) % mod;
  88.     };
  89.     int mxa = 0;
  90.     vector<int> b = a;
  91.     {
  92.         sort(all(b));
  93.         b.resize(unique(all(b)) - b.begin());
  94.         for (int& i : a) {
  95.             i = lower_bound(all(b), i) - b.begin();
  96.         }
  97.         mxa = (int)b.size() + 1;
  98.     }
  99.     vector<Query> mo;
  100.     vector<int> ans(q);
  101.     for (int i = 0; i < q; i++) {
  102.         int l, r; cin >> l >> r;
  103.         l--, r--;
  104.         mo.push_back(Query(l, r, i));
  105.     }
  106.     sort(all(mo));
  107.     int res = 0;
  108.     if (is_sorted(all(a))) {
  109.         int seg_sum = 0, index = 0;
  110.         auto add = [&](int x, bool left) {
  111.             int right = (left ? seg_sum : 0);
  112.             res = (res + 2ll * right) % mod;
  113.             res = (res + 2ll * (b[x] * (!left ? index : 0)) % mod) % mod;
  114.             seg_sum += b[x];
  115.             seg_sum %= mod;
  116.             index++;
  117.         };
  118.         auto del = [&](int x, bool left) {
  119.             seg_sum = (seg_sum - b[x] + mod) % mod;
  120.             int right = (left ? seg_sum : 0);
  121.             res = (res - 2ll * right + mod) % mod;
  122.             res = (res - 2ll * (b[x] * (!left ? index - 1 : 0)) % mod + 2ll * mod) % mod;
  123.             index--;
  124.         };
  125.  
  126.         int l = 0, r = -1;
  127.         for (const Query& i : mo) {
  128.             while (l > i.l) {
  129.                 add(a[--l], 1);
  130.             }
  131.             while (r < i.r) {
  132.                 add(a[++r], 0);
  133.             }
  134.             while (l < i.l) {
  135.                 del(a[l++], 1);
  136.             }
  137.             while (r > i.r) {
  138.                 del(a[r--], 0);
  139.             }
  140.             int f = (res - ((i.r - i.l) * (get_sum(i.l, i.r))) % mod + mod) % mod;
  141.             ans[i.ind] = (f * (i.r - i.l + 1)) % mod;
  142.             ans[i.ind] *= 3ll;
  143.             ans[i.ind] %= mod;;
  144.         }
  145.         for (int& i : ans) {
  146.             cout << i << '\n';
  147.         }
  148.         return 0;
  149.     }
  150.  
  151.     Fenwick T(mxa), kth(mxa);
  152.     auto add = [&](int x) {
  153.         int right = T.sum(x + 1, mxa);
  154.         res = (res + 2ll * right) % mod;
  155.         res = (res + 2ll * (b[x] * (kth.get(x))) % mod) % mod;
  156.         T.upd(x + 1, b[x]);
  157.         kth.upd(x + 1, 1);
  158.     };
  159.     auto del = [&](int x) {
  160.         int right = T.sum(x + 2, mxa);
  161.         res = (res - 2ll * right + mod) % mod;
  162.         res = (res - 2ll * (b[x] * (kth.get(x))) % mod + 2ll * mod) % mod;
  163.         T.upd(x + 1, -b[x]);
  164.         kth.upd(x + 1, -1);
  165.     };
  166.     int l = 0, r = -1;
  167.     for (const Query& i : mo) {
  168.         while (l > i.l) {
  169.             add(a[--l]);
  170.         }
  171.         while (r < i.r) {
  172.             add(a[++r]);
  173.         }
  174.         while (l < i.l) {
  175.             del(a[l++]);
  176.         }
  177.         while (r > i.r) {
  178.             del(a[r--]);
  179.         }
  180.         int f = (res - ((i.r - i.l) * (get_sum(i.l, i.r))) % mod + mod) % mod;
  181.         ans[i.ind] = (f * (i.r - i.l + 1)) % mod;
  182.         ans[i.ind] *= 3ll;
  183.         ans[i.ind] %= mod;;
  184.     }
  185.     for (int& i : ans) {
  186.         cout << i << '\n';
  187.     }
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement