#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
#define pii pair<int,int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-lopps")
#define sz(x) (int)((x).size())
#define int long long
using namespace std;
const int mod=1e9+7,mxn=1e6,inf=1e9,minf=-1e9,lg=30,Mxn=1e9;
int n,k,m,d,q;
int val[mxn+10][2];
int P[mxn+10],sub[mxn+10][2],sz;
vector<int>comp;
struct seg{
int dp[4*mxn+10],waysx[4*mxn+10],ways[4*mxn+10];
pii lazy[4*mxn+10];
//waysx= ways*x
inline void init(){for(int i=0;i<=4*sz;i++)dp[i]=waysx[i]=ways[i]=0,lazy[i]={1,0};}
inline void apply(int pos,pii x){
dp[pos]=((x.f*dp[pos])%mod+(x.s*waysx[pos])%mod)%mod;
waysx[pos]=(x.f*waysx[pos])%mod;
ways[pos]=(x.f*ways[pos])%mod;
lazy[pos]={(lazy[pos].f*x.f)%mod,((lazy[pos].s*x.f)%mod+(lazy[pos].f*x.s)%mod)%mod};
}
inline void push(int pos,int l,int r){
if(lazy[pos].f==1&&lazy[pos].s==0)return;
if(l!=r){
apply(pos<<1,lazy[pos]);
apply(pos<<1|1,lazy[pos]);
}
lazy[pos]={1,0};
}
inline void pull(int pos){
dp[pos]=(dp[pos<<1]+dp[pos<<1|1])%mod;
waysx[pos]=(waysx[pos<<1]+waysx[pos<<1|1])%mod;
ways[pos]=(ways[pos<<1]+ways[pos<<1|1])%mod;
}
inline void update(int ql,int qr,int k,int pos=1,int l=0,int r=sz){
if(l>qr||r<ql)return;
if(ql<=l&&r<=qr)return void(apply(pos,{k,k}));
push(pos,l,r);
update(ql,qr,k,pos<<1,l,((l+r)>>1));
update(ql,qr,k,pos<<1|1,((l+r)>>1)+1,r);
pull(pos);
}
inline void modify(int qpos,int d,int w,int pos=1,int l=0,int r=sz){
if(l>qpos||r<qpos)return;
if(l==r){
dp[pos]=(dp[pos]+d)%mod;
ways[pos]=(ways[pos]+w)%mod;
waysx[pos]=(waysx[pos]+(w*comp[l])%mod)%mod;
return;
}
push(pos,l,r);
if(qpos<=(l+r)>>1)modify(qpos,d,w,pos<<1,l,((l+r)>>1));
else modify(qpos,d,w,pos<<1|1,((l+r)>>1)+1,r);
pull(pos);
}
inline pii get(int ql, int qr, int pos=1, int l=0, int r=sz) {
if (l > qr || r < ql) return {0,0};
if (ql <= l && r <= qr) return {ways[pos],dp[pos]};
push(pos, l, r);
int m = (l + r) >> 1;
pii a=get(ql,qr,pos<<1,l,m);
pii b=get(ql,qr,pos<<1|1,m+1,r);
return {(a.f+b.f)%mod,(a.s+b.s)%mod};
}
}t;
int pref[mxn+10],suf[mxn+10];
struct fen{
int fwk[mxn+10];
inline void init(){for(int i=0;i<=sz+1;i++)fwk[i]=0;}
inline void update(int pos,int val){
pos++;
if(pos<=0)return;
for(int i=pos;i<=sz+1;i+=(i&-i))fwk[i]+=val;
}
inline int qry(int pos){
pos++;
int sum=0;
if(pos<=0)return 0;
for(int i=pos;i>0;i-=(i&-i))sum+=fwk[i];
return sum;
}
}tmx;
pii upd[2];
int32_t main(){
fastio
cin>>n;
int ans=0;
P[0]=1;
comp.pb(0);
for(int i=1;i<=n;i++)P[i]=(P[i-1]*2LL)%mod;
for(int i=1;i<=n;i++)cin>>val[i][0];
for(int i=1;i<=n;i++){
cin>>val[i][1];
if(val[i][0]>val[i][1])swap(val[i][0],val[i][1]);
comp.pb(val[i][0]);
comp.pb(val[i][1]);
}
sort(all(comp));
comp.erase(unique(all(comp)),comp.end());
sz=comp.size()-1;
for(int i=1;i<=n;i++){
val[i][0]=lb(all(comp),val[i][0])-comp.begin();
val[i][1]=lb(all(comp),val[i][1])-comp.begin();
}
for(int i=1;i<=n;i++){
for(int k=0;k<2;k++)ans=(ans-(P[n-1]*comp[val[i][k]])%mod+mod)%mod;
}
int sum2=0;
t.init();
t.modify(0,0,1);
for(int i=1;i<=n;i++)tmx.update(val[i][1],1);
suf[n+1]=minf;
pref[0]=minf;
for(int i=n;i>=1;i--)suf[i]=max(suf[i+1],val[i][0]);
for(int i=1;i<=n;i++)pref[i]=max(pref[i-1],val[i][0]);
pii x;
for(int i=1;i<=n;i++){
tmx.update(val[i][1],-1);
for(int k=0;k<2;k++){
if (suf[i+1] <= val[i][k]-1) {
sum2 = P[tmx.qry(val[i][k]-1)];
x=t.get(0,val[i][k]);
ans=(ans+(sum2*(x.s+(x.f*comp[val[i][k]])%mod)%mod)%mod)%mod;
sub[i][k]=sum2;
}
x=t.get(0,val[i][k]-1);
upd[k]={x.s, x.f};
}
t.update(0,val[i][0]-1,0);
t.update(val[i][0],val[i][1]-1,1);
t.update(val[i][1],sz,2);
for(int k=0;k<2;k++){
t.modify(val[i][k],(upd[k].f+(comp[val[i][k]]*upd[k].s)%mod)%mod,upd[k].s);
}
}
for(int i=1;i<=n;i++)tmx.update(val[i][1],1);
t.init();
t.modify(0,0,1);
for(int i=n;i>=1;i--){
//fix left equal
tmx.update(val[i][1],-1);
for (int k = 0; k < 2; k++) {
x=t.get(0,val[i][k]-1);
if (pref[i-1] <= val[i][k]) {
sum2 = P[tmx.qry(val[i][k])];
ans=(ans+(sum2*(x.s+(x.f*comp[val[i][k]])%mod)%mod)%mod)%mod;
ans=(ans-sub[i][k]*sum2%mod*comp[val[i][k]]%mod+mod)%mod;
}
upd[k] = {x.s, x.f};
}
t.update(0,val[i][0]-1,0);
t.update(val[i][0],val[i][1]-1,1);
t.update(val[i][1],sz,2);
for(int k=0;k<2;k++){
t.modify(val[i][k],(upd[k].f+(comp[val[i][k]]*upd[k].s)%mod)%mod,upd[k].s);
}
}
cout<<ans;
}
/*
*/
Compilation message (stderr)
Main.cpp:12:40: warning: bad option '-funroll-lopps' to pragma 'optimize' [-Wpragmas]
12 | #pragma GCC optimize ("03,unroll-lopps")
| ^
Main.cpp:28:26: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
28 | inline void init(){for(int i=0;i<=4*sz;i++)dp[i]=waysx[i]=ways[i]=0,lazy[i]={1,0};}
| ^
Main.cpp:30:40: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
30 | inline void apply(int pos,pii x){
| ^
Main.cpp:36:45: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
36 | inline void push(int pos,int l,int r){
| ^
Main.cpp:44:33: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
44 | inline void pull(int pos){
| ^
Main.cpp:49:74: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
49 | inline void update(int ql,int qr,int k,int pos=1,int l=0,int r=sz){
| ^
Main.cpp:57:75: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
57 | inline void modify(int qpos,int d,int w,int pos=1,int l=0,int r=sz){
| ^
Main.cpp:70:64: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
70 | inline pii get(int ql, int qr, int pos=1, int l=0, int r=sz) {
| ^
Main.cpp:85:26: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
85 | inline void init(){for(int i=0;i<=sz+1;i++)fwk[i]=0;}
| ^
Main.cpp:86:43: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
86 | inline void update(int pos,int val){
| ^
Main.cpp:91:31: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
91 | inline int qry(int pos){
| ^
Main.cpp:100:14: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
100 | int32_t main(){
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |