1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #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); } }
|