int arr[100005];
struct node{ int l,r; int sum=0,lz=0; } tree[400005];
void build(int l, int r, int i=1){ tree[i].l = l; tree[i].r = r; if(r==l){ tree[i].sum = arr[l]; return; } int mid = (l+r)>>1; build(l,mid,2*i); build(mid+1,r,2*i+1); tree[i].sum = tree[2*i].sum + tree[2*i+1].sum; }
void pushdown(int i){ if(tree[i].l == tree[i].r) return; if(tree[i].lz!=0){ int lz = tree[i].lz; tree[2*i].lz += lz; tree[2*i+1].lz += lz; tree[2*i].sum += lz*(tree[2*i].r-tree[2*i].l+1); tree[2*i+1].sum += lz*(tree[2*i+1].r-tree[2*i+1].l+1); tree[i].lz = 0; } }
int arr[100005]; int m; struct node{ int l,r; int sum; int plz=0,mlz=1; } tree[400005];
void build(int l, int r, int i=1){ tree[i].l = l; tree[i].r = r; if(l==r){ tree[i].sum = arr[l]; return; } int mid = (l+r)>>1; build(l,mid,i<<1); build(mid+1,r,i<<1|1); tree[i].sum = (tree[i<<1].sum + tree[i<<1|1].sum)%m; }
void pushdown(int i){ if(tree[i].l==tree[i].r) return; if(tree[i].plz!=0 || tree[i].mlz!=1){ int plz = tree[i].plz, mlz = tree[i].mlz; tree[i<<1].mlz = (tree[i<<1].mlz*mlz)%m; tree[i<<1].plz = (tree[i<<1].plz*mlz+plz)%m; tree[i<<1|1].mlz = (tree[i<<1|1].mlz*mlz)%m; tree[i<<1|1].plz = (tree[i<<1|1].plz*mlz+plz)%m;
int s1=tree[i<<1].r-tree[i<<1].l+1, s2=tree[i<<1|1].r-tree[i<<1|1].l+1; tree[i<<1].sum = (mlz*tree[i<<1].sum+plz*s1)%m; tree[i<<1|1].sum = (mlz*tree[i<<1|1].sum+plz*s2)%m;
tree[i].plz = 0; tree[i].mlz = 1; } }
void add(int l, int r, int mk, int pk, int i=1){ if(tree[i].l>=l && tree[i].r<=r){ int s = tree[i].r - tree[i].l +1; tree[i].mlz = (tree[i].mlz*mk)%m; tree[i].plz = (mk*tree[i].plz + pk)%m; tree[i].sum = (mk*tree[i].sum+pk*s)%m; return; } if(tree[i].l>r || tree[i].r<l) return; pushdown(i); if(tree[i<<1].r>=l) add(l,r,mk,pk,i<<1); if(tree[i<<1|1].l<=r) add(l,r,mk,pk,i<<1|1); tree[i].sum = (tree[i<<1].sum + tree[i<<1|1].sum)%m; }
int search(int l, int r, int i=1){ if(tree[i].l>=l && tree[i].r<=r) return tree[i].sum; if(tree[i].l>r || tree[i].r<l) return 0; pushdown(i); int s = 0; if(tree[i<<1].r>=l) s = (s+search(l,r,i<<1))%m; if(tree[i<<1|1].l<=r) s = (s+search(l,r,i<<1|1))%m; return s; }
|