#pragma GCC optimize("O3") #include using namespace std; using ll=long long; using P=pair; template using V=vector; #define fi first #define se second #define all(v) (v).begin(),(v).end() const ll inf=(1e18); // const ll mod=998244353; const ll mod=1000000007; const vector dy={-1,0,1,0},dx={0,-1,0,1}; struct __INIT{__INIT(){cin.tie(0);ios::sync_with_stdio(false);cout< bool chmax(T &a, const T &b) { if (a bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; } templatevoid debag(const vector &a){cerr<<"debag :";for(auto v:a)cerr<void print(const vector &a){for(auto v:a)cout<>=1ll; } return res; } mint inv()const{return pow(mod-2);} //拡張ユークリッドの互除法 /* mint inv()const{ int x,y; int g=extgcd(v,mod,x,y); assert(g==1); if(x<0)x+=mod; return mint(x); }*/ friend ostream& operator<<(ostream&os,const mint&val){ return os<(const mint&val)const{return v>val.v;} }; template struct ST{//1index query l,r lが開区間 using F = function; int n; F f; T ti; vector dat; ST(){}; ST(F f,T ti):f(f),ti(ti){} void init(int n_){ n=1; while(n &v){ int n_=v.size(); init(n_); for(int i=0;i>=1) dat[k]=f(dat[(k<<1)|0],dat[(k<<1)|1]); } T query(int a,int b){ T vl=ti,vr=ti; for(int l=a+n,r=b+n;l>=1,r>>=1) { if(l&1) vl=f(vl,dat[l++]); if(r&1) vr=f(dat[--r],vr); } return f(vl,vr); } }; int main(){ auto f=[&](mint a,mint b){ return a+b; }; int n; cin>>n; V a(n); map mp; for(int i=0;i>a[i]; mp[a[i]]; } int id=0; for(auto &p:mp){ p.se=id++; } for(int i=0;i dp1(f,mint(0)),dp2(f,mint(0)); dp1.init(n+5);dp2.init(n+5); for(int i=n-1;i>=0;i--){ dp2.set_val(a[i],dp2.query(a[i],a[i]+1)+mint(2).pow(n-1-i)); } mint ans=mint(0); for(int i=0;i