Untitled

 avatar
unknown
c_cpp
a year ago
2.3 kB
13
Indexable
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int tt, tc;

const int mod = 1e9 + 7;
int add(int x, int y) { return (x + y) % mod; }
int sub(int x, int y) { return (x - y + mod) % mod; }
int mul(int x, int y) { return (x * 1LL * y) % mod; }
int modpow(int n, int k) {
    int res = 1;
    while (k) {
        if (k & 1) res = mul(res, n);
        n = mul(n, n);
        k >>= 1;
    }
    return res;
}
int divide(int a, int b) { return mul(a, modpow(b, mod - 2)); }

struct fenwick_point {
    int n;
    vector<int> fenw;
    fenwick_point(int _n) : n(_n + 5) { fenw.resize(n); }

    void increment(int i, int v) {
        for (++i; i < n; i += (i & -i)) fenw[i] = add(fenw[i], v);
    }
    int query(int i) {
        int res = 0;
        for (++i; i > 0; i -= (i & -i)) res = add(res, fenw[i]);
        return res;
    }
};


void solve() {
    int n;
    cin >> n;
    vector<ll> a(n);
    for (ll& u : a) cin >> u;

    auto modulo = [&](ll x) {
        while (x < 0) x += (ll)mod;
        return x % mod;
    };

    map<ll, int> comp;
    for (ll u : a) comp[u];
    int id = 1;
    for (auto& u : comp) u.second = id++;

    fenwick_point freq(n + 1);
    fenwick_point sum(n + 5);

    vector<int> p2(n + 5), invp2(n + 5);
    p2[0] = invp2[0] = 1;
    p2[1] = 2;
    invp2[1] = divide(1, 2);
    for (int i = 2; i <= n + 4; i++) {
        p2[i] = mul(p2[i - 1], p2[1]);
        invp2[i] = mul(invp2[i - 1], invp2[1]);
    }

    int res = 0;
    for (int i = 0; i < n; i++) {
        int j = comp[a[i]];

        // (a[i] - a[before]) * 2^{before - 1} * 2^{n - i - 1}
        res = add(res, mul(mul(modulo(a[i]), freq.query(j - 1)), p2[n - i - 1]));
        res = sub(res, mul(sum.query(j - 1), p2[n - i - 1]));

        // (a[before] - a[i]) * 2^{before - 1} * 2^{n - i - 1}
        res = add(res, mul(sub(sum.query(n + 3), sum.query(j - 1)), p2[n - i - 1]));
        res = sub(res, mul(mul(modulo(a[i]), p2[n - i - 1]), sub(freq.query(n + 3), freq.query(j - 1))));

        freq.increment(j, p2[i]);
        sum.increment(j, mul(p2[i], modulo(a[i])));
    }

    cout << res << "\n";
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    tt = 1, tc = 1; // cin >> tt;
    while (tt--) solve(), tc++;
}
Editor is loading...
Leave a Comment