#include <bits/stdc++.h>
#include "horses.h"
using namespace std;
const int nax=1e5+5;
const int mod=1e9+7;
typedef long long ll;
struct node{
double lg,lgv;
int x,y,val;
};
node rt[4*nax];
int *X,*Y;
int N;
void updX(int k, int x, int y, int a, int val){
if(x>a||y<a)return;
if(x==y){
rt[k].x=val;
rt[k].lg=log(val);
rt[k].val=(val*(ll)rt[k].y)%mod;
rt[k].lgv=rt[k].lg+log(rt[k].y);
}
int m=(x+y)/2;
updX(2*k,x,m,a,val);
updX(2*k+1,m+1,y,a,val);
rt[k].x=(rt[2*k].x*(ll)rt[2*k+1].x)%mod;
rt[k].lg=rt[2*k].lg+rt[2*k+1].lg;
if(rt[2*k].lgv<rt[2*k+1].lgv+rt[2*k].lg){
rt[k].lgv=rt[2*k+1].lgv+rt[2*k].lg;
rt[k].val=(rt[2*k].x*(ll)rt[2*k+1].val)%mod;
}else{
rt[k].lgv=rt[2*k].lgv;
rt[k].val=rt[2*k].val;
}
}
void updY(int k, int x, int y, int a, int val){
if(x>a||y<a)return;
if(x==y){
rt[k].y=val;
rt[k].val=(rt[k].x*(ll)val)%mod;
rt[k].lgv=rt[k].lg+log(val);
return;
}
int m=(x+y)/2;
updY(2*k,x,m,a,val);
updY(2*k+1,m+1,y,a,val);
rt[k].x=(rt[2*k].x*(ll)rt[2*k+1].x)%mod;
rt[k].lg=rt[2*k].lg+rt[2*k+1].lg;
if(rt[2*k].lgv<rt[2*k+1].lgv+rt[2*k].lg){
rt[k].lgv=rt[2*k+1].lgv+rt[2*k].lg;
rt[k].val=(rt[2*k].x*(ll)rt[2*k+1].val)%mod;
}else{
rt[k].lgv=rt[2*k].lgv;
rt[k].val=rt[2*k].val;
}
}
void build(int k, int x, int y){
if(x==y){
rt[k].y=Y[x];
rt[k].x=X[x];
rt[k].lg=log(X[x]);
rt[k].lgv=log(Y[x])+rt[k].lg;
rt[k].val=(rt[k].x*(ll)rt[k].y)%mod;
}
int m=(x+y)/2;
build(2*k,x,m);
build(2*k+1,m+1,y);
rt[k].x=(rt[2*k].x*(ll)rt[2*k+1].x)%mod;
rt[k].lg=rt[2*k].lg+rt[2*k+1].lg;
if(rt[2*k].lgv<rt[2*k+1].lgv+rt[2*k].lg){
rt[k].lgv=rt[2*k+1].lgv+rt[2*k].lg;
rt[k].val=(rt[2*k].x*(ll)rt[2*k+1].val)%mod;
}else{
rt[k].lgv=rt[2*k].lgv;
rt[k].val=rt[2*k].val;
}
}
int init(int N, int X[], int Y[]) {
::N=N;
::X=X;
::Y=Y;
build(1,0,N-1);
return rt[1].val;
}
int updateX(int pos, int val) {
updX(1,0,N-1,pos,val);
return rt[1].val;
}
int updateY(int pos, int val) {
updY(1,0,N-1,pos,val);
return rt[1].val;
}