#include #define MOD 1000000007LL using namespace std; typedef long long ll; typedef pair P; struct valu{ ll sum=0,l=0,r=0; int flag=0; valu(){ } valu(ll a,ll b,ll c,int f){ sum=a; l=b; r=c; flag=f; } }; int n; int fie[10000000]; struct segtree{ static const int N=1<<17; valu val[1<<18]; void update(int k,ll v){ k+=N-1; val[k]=valu(v,v,v,1); int nl=k-N+1,nr=k+1-N+1; int s=1; while(k>0){ int pr=k; k=(k-1)/2; if(pr==k*2+1){ nr+=s; }else{ nl-=s; } s*=2; if(nl<0 || nr>=N){ puts("error\n"); } if(fie[(nl+nr)/2-1]==0){ val[k]=valu((val[k*2+1].sum+val[k*2+2].sum)%MOD,val[k*2+1].l,val[k*2+2].r,0); }else{ valu vl=val[k*2+1]; valu vr=val[k*2+2]; if(vl.flag==1 && vr.flag==1){ val[k]=valu(vl.sum*vr.sum%MOD,vl.sum*vr.sum%MOD,vl.sum*vr.sum%MOD,1); }else if(vl.flag==1){ val[k]=valu((vl.sum*vr.l+vr.r)%MOD,vl.sum*vr.l%MOD,vr.r,0); }else if(vr.flag==1){ val[k]=valu((vl.r*vr.sum+vl.l)%MOD,vl.l,vr.sum*vl.r%MOD,0); }else{ val[k]=valu((vl.r*vr.l+vl.l+vr.r)%MOD,vl.l,vr.r,0); } } //printf("%d %lld %d %d %lld %lld %lld\n",k,v,nl,nr,val[k].sum,val[k*2+1].sum,val[k*2+2].sum); } } void update2(int v){ stack st; int l=0,r=N; int k=0; int s=N; while(1){ st.push(k); if(v<(l+r)/2-1){ r=(l+r)/2; k=k*2+1; }else if(v==(l+r)/2-1){ break; }else if(v>(l+r)/2-1){ l=(l+r)/2; k=k*2+2; } s/=2; } //printf("%d %d %d\n",l,r,v); int nl=l,nr=r; int pr=-1; s/=2; while(st.size()){ k=st.top(); //printf("%d ",k); st.pop(); if(pr!=-1){ if(pr==k*2+1){ nr+=s; }else{ nl-=s; } s*=2; } if(nl<0 || nr>=N){ puts("error\n"); } pr=k; //printf("%d %d %d %d %lld %lld ",nl,nr,(nl+nr)/2-1,fie[(nl+nr)/2-1],val[k*2+1].sum,val[k*2+2].sum); if(fie[(nl+nr)/2-1]==0){ val[k]=valu((val[k*2+1].sum+val[k*2+2].sum)%MOD,val[k*2+1].l,val[k*2+2].r,0); }else{ valu vl=val[k*2+1]; valu vr=val[k*2+2]; if(vl.flag==1 && vr.flag==1){ val[k]=valu(vl.sum*vr.sum%MOD,vl.sum*vr.sum%MOD,vl.sum*vr.sum%MOD,1); }else if(vl.flag==1){ val[k]=valu((vl.sum*vr.l+vr.r)%MOD,vl.sum*vr.l%MOD,vr.r,0); }else if(vr.flag==1){ val[k]=valu((vl.r*vr.sum+vl.l)%MOD,vl.l,vr.sum*vl.r%MOD,0); }else{ val[k]=valu((vl.r*vr.l+vl.l+vr.r)%MOD,vl.l,vr.r,0); } } } //printf("\n"); } valu query(int a,int b,int k=0,int l=0,int r=N){ //printf("%d %d %lld\n",l,r,val[k].sum); if(b<=l || r<=a)return valu(0,0,0,-1); if(a<=l && r<=b)return val[k]; int mid=(l+r)/2; valu vl=query(a,b,k*2+1,l,mid); valu vr=query(a,b,k*2+2,mid,r); //printf("%d %d %lld %lld\n",l,r,vl.sum,vr.sum); if(vl.flag==-1){ return vr; } if(vr.flag==-1){ return vl; } if(fie[mid-1]==1){ if(vl.flag==1 && vr.flag==1){ return valu(vl.sum*vr.sum%MOD,vl.sum*vr.sum%MOD,vl.sum*vr.sum%MOD,1); } if(vl.flag==1){ return valu((vl.sum*vr.l+vr.r)%MOD,vl.sum*vr.l%MOD,vr.r,0); } if(vr.flag==1){ return valu((vl.r*vr.sum+vl.l)%MOD,vl.l,vr.sum*vl.r%MOD,0); } return valu((vl.r*vr.l+vl.l+vr.r)%MOD,vl.l,vr.r,0); }else{ return valu((vl.sum+vr.sum)%MOD,vl.l,vr.r,0); } } }; int va[1000000]; segtree seg; int main(void){ scanf("%d%*c",&n); //printf("%d\n",n); for(int i=0;i