#define ml ((l+r)>>1)
#define mr (ml+1)
const int maxn=3e5+5;
int a[maxn];
int ls[maxn*2],rs[maxn*2],tot;
int cov[maxn*2];
ll sum[maxn*2];int mi[maxn*2],mx[maxn*2];
inline void modify(int&u,int l,int r,int cov_){
if(cov_!=-1){
cov[u]=cov_;
sum[u]=1ll*cov_*(r-l+1);
mi[u]=mx[u]=cov_;
}
}
inline void push_down(int u,int l,int r){
modify(ls[u],l,ml,cov[u]);
modify(rs[u],mr,r,cov[u]);
cov[u]=-1;
}
inline void pushup(int u,int l,int r){
mi[u]=min(mi[ls[u]],mi[rs[u]]);
mx[u]=max(mx[ls[u]],mx[rs[u]]);
sum[u]=sum[ls[u]]+sum[rs[u]];
}
void updatecov(int u,int l,int r,int ql,int qr,int d){
if(ql<=l&&r<=qr){
modify(u,l,r,d);
return;
}
push_down(u,l,r);
if(ml>=ql) updatecov(ls[u],l,ml,ql,qr,d);
if(mr<=qr) updatecov(rs[u],mr,r,ql,qr,d);
pushup(u,l,r);
}
void updatephi(int u,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr&&mi[u]==mx[u]){
modify(u,l,r,math::phi[mi[u]]);
return;
}
push_down(u,l,r);
if(ml>=ql) updatephi(ls[u],l,ml,ql,qr);
if(mr<=qr) updatephi(rs[u],mr,r,ql,qr);
pushup(u,l,r);
}
ll query(int u,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return sum[u];
push_down(u,l,r);
ll ret=0;
if(ml>=ql) ret+=query(ls[u],l,ml,ql,qr);
if(mr<=qr) ret+=query(rs[u],mr,r,ql,qr);
return ret;
}
void build(int&u,int l,int r){
u=++tot;
cov[u]=-1;
if(l==r) sum[u]=mi[u]=mx[u]=a[l];
else{
build(ls[u],l,ml);
build(rs[u],mr,r);
pushup(u,l,r);
}
}