voidadd(int id, int v){ int len = t[id].r - t[id].l + 1; t[id].sum[2] = (t[id].sum[2] + (len * v % p * v % p * v % p) + (3 * v % p * v % p * t[id].sum[0] % p) + (3 * v % p * t[id].sum[1] % p)) % p; t[id].sum[1] = (t[id].sum[1] + (2 * v % p * t[id].sum[0] % p) + (len * v % p * v % p)) % p; t[id].sum[0] = (t[id].sum[0] + len * v % p) % p; t[id].lazy[0] = (t[id].lazy[0] + v) % p; }
voidmul(int id, int v){ t[id].sum[0] = (t[id].sum[0] * v) % p; t[id].sum[1] = (t[id].sum[1] * v % p * v) % p; t[id].sum[2] = (t[id].sum[2] * v % p * v % p * v) % p; t[id].lazy[0] = t[id].lazy[0] * v % p; t[id].lazy[1] = t[id].lazy[1] * v % p; }
voidequ(int id, int v){ int len = t[id].r - t[id].l + 1; t[id].sum[0] = len * v % p; t[id].sum[1] = t[id].sum[0] * v % p; t[id].sum[2] = t[id].sum[1] * v % p; t[id].lazy[0] = 0; t[id].lazy[1] = 1; t[id].lazy[2] = v; }
voidbuild(int id, int l, int r){ t[id] = node(l, r); if (l == r) { return; } int mid = (l + r) >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); }