| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 1149922 | sitablechair | Flooding Wall (BOI24_wall) | C++20 | 0 ms | 0 KiB | 
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("avx2,popcnt,lzcnt,abm,bmi,bmi2,fma,tune=native,sse,sse2,sse3")
#define ll long long
#define ldb long double
#define endl '\n'
#define For(i,l,r) for(int i=l;i<=r;i++)
#define ForD(i,r,l) for(int i=r;i>=l;i--)
#define ff first
#define ss second
#define pb push_back
#define all(x) x.begin(),x.end()
#define sz(x) (signed)x.size()
#define unq(x) x.resize(unique(all(x))-x.begin())
#define F "C"
#define fio freopen(F".INP","r",stdin);freopen(F".OUT","w",stdout);
#ifdef NCGM
#include"debug.h"
#else
#define debug(...) "fr";
#endif
using namespace std;
const int N=1e6+3,MOD=1e9+7;
int n,a[N],b[N],c[N],d[N],e[N][2];
ll pw[N*2];
pair<int,int> vt[N*2];
ll ans=0;
struct SegTree1 {
    struct Node {
        ll mul=0,x=0,x1=0;
        Node(ll mul=1,ll x=0,ll x1=0): mul(mul),x(x),x1(x1) {};
    } tr[N*4];
    Node mrg(const Node A,const Node B) {
        Node res;
        res.mul=A.mul*B.mul%MOD;
        res.x=(B.x+A.x*B.mul%MOD)%MOD;
        res.x1=(B.x1+A.x1*B.mul%MOD)%MOD;
        return res;
    }
    void build(int id,int l,int r) {
        if (l==r) {
            tr[id]=Node(c[l],d[l]*(l+1)%MOD*pw[l-1]%MOD,d[l]*pw[l-1]%MOD);
            return;
        }
        int mid=l+r>>1;
        build(id*2,l,mid);
        build(id*2+1,mid+1,r);
        tr[id]=mrg(tr[id*2],tr[id*2+1]);
    }
    void update(int id,int l,int r,int u) {
        if (l>u || r<u) return;
        if (l==r) {
            tr[id]=Node(c[l],d[l]*(l+1)%MOD*pw[l-1]%MOD,d[l]*pw[l-1]%MOD);
            return;
        }
        int mid=l+r>>1;
        update(id*2,l,mid,u);
        update(id*2+1,mid+1,r,u);
        tr[id]=mrg(tr[id*2],tr[id*2+1]);
    }
    Node query(int id,int l,int r,int u,int v) {
        if (l>v || r<u) return Node(1,0,0);
        if (l>=u && r<=v) return tr[id];
        int mid=l+r>>1;
        return mrg(query(id*2,l,mid,u,v),query(id*2+1,mid+1,r,u,v));
    }
} st1;
void solve(bool lmao=0) {
    fill(c,c+1+n,0);
    For(i,1,n) c[i]=0,d[i]=2;
    st1.build(1,1,n);
    For(i,1,2*n) {
        auto el=vt[i];
        if (el.ff>1) {
            ll right=(el.ff==n?1:st1.query(1,1,n,el.ff+1,n).mul);
            auto mmb=st1.query(1,1,n,1,el.ff-1);
            ll x=mmb.x%MOD,x1=mmb.x1%MOD;
            ll tmp=(1LL*x1*el.ff%MOD-x)%MOD;
            ans=(ans+e[el.ff][el.ss]*right%MOD*tmp%MOD);
            ans=(ans+e[el.ff][el.ss]*pw[el.ff-1]%MOD*right%MOD);
            if (lmao && el.ff<n) {
                ll left=st1.query(1,1,n,1,el.ff-1).mul;
                ans=(ans-e[el.ff][el.ss]*left%MOD*right%MOD);
            }
        }
        d[el.ff]--;
        c[el.ff]++;
        st1.update(1,1,n,el.ff);
    }
}
int main() {
    // fio
    cin.tie(0)->sync_with_stdio(0);
    cin >> n;
    pw[0]=1;
    For(i,1,n) pw[i]=pw[i-1]*2%MOD;
    For(i,1,n) {
        a[i]=2;
        cin >> a[i];
        e[i][0]=a[i];
    }
    For(i,1,n) {
        b[i]=1;
        cin >> b[i];
        e[i][1]=b[i];
    }
    if (n<=2) return void(cout << 0);
    For(i,1,n) vt[i]={i,0},vt[i+n]={i,1};
    sort(vt+1,vt+1+2*n,[=](const pair<int,int> A,const pair<int,int> B) {
        return e[A.ff][A.ss]<e[B.ff][B.ss];
    });
    solve();
    reverse(b+1,b+1+n);
    reverse(a+1,a+1+n);
    For(i,1,n) {
        e[i][0]=a[i];
        e[i][1]=b[i];
    }
    For(i,1,n*2) vt[i].ff=n-vt[i].ff+1; 
    solve(1);
    For(i,1,n) ans=(ans-1LL*a[i]*pw[n-1]%MOD)%MOD;
    For(i,1,n) ans=(ans-1LL*b[i]*pw[n-1]%MOD)%MOD;
    ans=(ans+MOD)%MOD;
    cout << ans;
    return 0;
}
