#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;
void setIO(string name){
ios_base::sync_with_stdio(0); cin.tie(0);
freopen((name+".in").c_str(),"r",stdin);
freopen((name+".out").c_str(),"w",stdout);
}
int val[mxn+10][2];
int P[mxn+10],sub[mxn+10][2];
int add(int x,int a){return ((ll)x+(ll)a+mod)%mod;}
int mul(int x,int a){return (1LL*x*a)%mod;}
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
void init(){for(int i=0;i<=4*comp.size();i++)dp[i]=waysx[i]=ways[i]=0,lazy[i]={1,0};}
pii merge(pii a,pii b){
return {mul(a.f,b.f),add(mul(a.s,b.f),mul(a.f,b.s))};
}
void apply(int pos,pii x){
dp[pos]=add(mul(x.f,dp[pos]),mul(x.s,waysx[pos]));
waysx[pos]=mul(x.f,waysx[pos]);
ways[pos]=mul(x.f,ways[pos]);
lazy[pos]=merge(lazy[pos],x);
}
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};
}
void pull(int pos){
dp[pos]=add(dp[pos<<1],dp[pos<<1|1]);
waysx[pos]=add(waysx[pos<<1],waysx[pos<<1|1]);
ways[pos]=add(ways[pos<<1],ways[pos<<1|1]);
}
void update(int ql,int qr,int k,int pos=1,int l=0,int r=comp.size()-1){
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);
}
void modify(int qpos,int d,int w,int pos=1,int l=0,int r=comp.size()-1){
if(l>qpos||r<qpos)return;
if(l==r){
dp[pos]=add(dp[pos],d);
ways[pos]=add(ways[pos],w);
waysx[pos]=add(waysx[pos],mul(w,comp[l]));
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);
}
int getways(int ql,int qr,int pos=1,int l=0,int r=comp.size()-1){
if(l>qr||r<ql)return 0;
if(ql<=l&&r<=qr)return ways[pos];
push(pos,l,r);
return add(getways(ql,qr,pos<<1,l,((l+r)>>1)),getways(ql,qr,pos<<1|1,((l+r)>>1)+1,r));
}
int getdp(int ql,int qr,int pos=1,int l=0,int r=comp.size()-1){
if(l>qr||r<ql)return 0;
if(ql<=l&&r<=qr)return dp[pos];
push(pos,l,r);
return add(getdp(ql,qr,pos<<1,l,((l+r)>>1)),getdp(ql,qr,pos<<1|1,((l+r)>>1)+1,r));
}
}t;
struct fen{
int fwk[mxn+10];
void init(){for(int i=0;i<=comp.size();i++)fwk[i]=0;}
void update(int pos,int val){
pos++;
if(pos<=0)return;
for(int i=pos;i<=comp.size();i+=(i&-i))fwk[i]+=val;
}
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,tmn;
int32_t main(){
fastio
cin>>n;
int mx=0,ans=0;
P[0]=1;
comp.pb(0);
for(int i=1;i<=n;i++)P[i]=mul(P[i-1],2LL);
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());
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=add(ans,-mul(P[n-1],comp[val[i][k]]));
}
vector<pii>upd;
int sumd=0,sumw=0,sum2=0;
t.init();
t.modify(0,0,1);
for(int i=1;i<=n;i++)tmx.update(val[i][1],1),tmn.update(val[i][0],1);
for(int i=1;i<=n;i++){
tmx.update(val[i][1],-1);
tmn.update(val[i][0],-1);
for(int k=0;k<2;k++){
if(tmn.qry(val[i][k]-1)==n-i)sum2=P[tmx.qry(val[i][k]-1)];
else sum2=0;
sumd=t.getdp(0,val[i][k]);
sumw=t.getways(0,val[i][k]);
sub[i][k]=sum2;
ans=add(ans,mul(add(sumd,mul(sumw,comp[val[i][k]])),sum2));
}
upd.clear();
for(int k=0;k<2;k++){
upd.pb({t.getdp(0,val[i][k]-1),t.getways(0,val[i][k]-1)});
}
t.update(0,val[i][0]-1,0);
t.update(val[i][0],val[i][1]-1,1);
t.update(val[i][1],comp.size()-1,2);
for(int k=0;k<2;k++){
t.modify(val[i][k],add(upd[k].f,mul(comp[val[i][k]],upd[k].s)),upd[k].s);
}
}
for(int i=1;i<=n;i++)tmx.update(val[i][1],1),tmn.update(val[i][0],1);
t.init();
t.modify(0,0,1);
for(int i=n;i>=1;i--){
//fix left equal
tmx.update(val[i][1],-1);
tmn.update(val[i][0],-1);
for(int k=0;k<2;k++){
if(tmn.qry(val[i][k])==i-1)sum2=P[tmx.qry(val[i][k])];
else sum2=0;
sumd=t.getdp(0,val[i][k]-1);
sumw=t.getways(0,val[i][k]-1);
ans=add(ans,mul(add(sumd,mul(sumw,comp[val[i][k]])),sum2));
ans=add(ans,-mul(comp[val[i][k]],mul(sub[i][k],sum2)));
}
upd.clear();
for(int k=0;k<2;k++){
upd.pb({t.getdp(0,val[i][k]-1),t.getways(0,val[i][k]-1)});
}
t.update(0,val[i][0]-1,0);
t.update(val[i][0],val[i][1]-1,1);
t.update(val[i][1],comp.size()-1,2);
for(int k=0;k<2;k++){
t.modify(val[i][k],add(upd[k].f,mul(comp[val[i][k]],upd[k].s)),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:20:23: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
20 | void setIO(string name){
| ^
Main.cpp:27:20: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
27 | int add(int x,int a){return ((ll)x+(ll)a+mod)%mod;}
| ^
Main.cpp:28:20: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
28 | int mul(int x,int a){return (1LL*x*a)%mod;}
| ^
Main.cpp:35:19: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
35 | void init(){for(int i=0;i<=4*comp.size();i++)dp[i]=waysx[i]=ways[i]=0,lazy[i]={1,0};}
| ^
Main.cpp:37:30: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
37 | pii merge(pii a,pii b){
| ^
Main.cpp:40:33: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
40 | void apply(int pos,pii x){
| ^
Main.cpp:46:38: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
46 | void push(int pos,int l,int r){
| ^
Main.cpp:54:26: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
54 | void pull(int pos){
| ^
Main.cpp:59:78: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
59 | void update(int ql,int qr,int k,int pos=1,int l=0,int r=comp.size()-1){
| ^
Main.cpp:67:79: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
67 | void modify(int qpos,int d,int w,int pos=1,int l=0,int r=comp.size()-1){
| ^
Main.cpp:80:72: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
80 | int getways(int ql,int qr,int pos=1,int l=0,int r=comp.size()-1){
| ^
Main.cpp:86:70: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
86 | int getdp(int ql,int qr,int pos=1,int l=0,int r=comp.size()-1){
| ^
Main.cpp:96:19: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
96 | void init(){for(int i=0;i<=comp.size();i++)fwk[i]=0;}
| ^
Main.cpp:97:36: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
97 | void update(int pos,int val){
| ^
Main.cpp:102:24: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
102 | int qry(int pos){
| ^
Main.cpp:111:14: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
111 | int32_t main(){
| ^
Main.cpp: In function 'void setIO(std::string)':
Main.cpp:22:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
22 | freopen((name+".in").c_str(),"r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:23:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
23 | freopen((name+".out").c_str(),"w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |