#include #include #include #include #include #include #include using namespace std; typedef unsigned int uint; typedef long long LL; #define FOR(k,a,b) for(uint k(a); k < (b); ++k) #define REP(k,a) for(uint k=0; k < (a); ++k) const int MOD = 1e9 + 7; vector calc(const vector& a) { int N = a.size(); vector prev(N,-1), next(N,N) , mv, diff(N),r(N); REP(i,N) { while( mv.size() && a[i] >= a[mv.back()] ) { next[mv.back()]=i; mv.pop_back(); } if(mv.empty()) prev[i]=-1; else prev[i]=mv.back(); mv.push_back(i); } REP(i,N) { diff[i] = next[i] - prev[i]; r[i] = min(next[i]-i, i-prev[i]); } vector su1(N+2), su2(N+2), su3(N+2) ; LL su = 0, val=0, inc = 0; vector res(N+2); REP(i,N) { su = (su + a[i]) % MOD; su1[r[i]+1] = ( su1[r[i]+1] + a[i] ) % MOD; su2[diff[i]- r[i]] = ( su2[diff[i]- r[i]] + a[i] ) % MOD; su3[diff[i]] = (su3[diff[i]] + a[i]) % MOD; } res[0]=su; inc = su; val = inc; FOR(i,1,N+1) { inc -= su1[i+1]; if (inc < 0) inc += MOD; inc -= su2[i]; if (inc < 0) inc += MOD; inc += su3[i]; if (inc >= MOD) inc -= MOD; val += inc; if(val >= MOD) val -= MOD; res[i] = val % MOD; } return res; } int main (int argc, char** argv) { #ifdef HOME freopen("in.txt","rb",stdin); freopen("out.txt","wb",stdout); #endif int N; scanf("%d",&N); vector A(N),B(N); REP(i,N) { scanf("%d",&A[i]); A[i]+=i+1; } REP(i,N) { scanf("%d",&B[i]); B[i]+=i+1; } vector cA = calc(A); vector cB = calc(B); vector res(cA.size()); REP(i,N) { res[i] = (cA[i] * cB[i]) % MOD; printf("%lld\n",res[i]); } return 0; }