70分求助
查看原帖
70分求助
359492
BZHZS楼主2022/8/12 09:25
/*
(k1x + b) * k2 = (k1 * k2)x + b * k1
(k1x + b) + k2 = k1x + (b + k2)
*/

#include <iostream>
#define BZHZS puts("BZH is a handsome boy");
#define ll long long
using namespace std;

struct node
{
    ll k, b;
};

const int N = 100010;

node tag[4 * N];
ll sum[4 * N], a[N];
ll mod, kk;
int n, m, c, xx, yy;

void build(int x, int l, int r)
{
    tag[x].k = 1;
    tag[x].b = 0;
    if (l == r)
    {
        sum[x] = a[l] % mod;
        return;
    }
    int mid = (l + r) / 2;
    build(x * 2, l, mid);
    build(x * 2 + 1, mid + 1, r);
    sum[x] = (sum[x * 2] + sum[x * 2 + 1]) % mod;
}

void pushdown(int x, int llen, int rlen)
{
    tag[x * 2].k = (tag[x * 2].k * tag[x].k) % mod;
    tag[x * 2 + 1].k = (tag[x * 2 + 1].k * tag[x].k) % mod;
    tag[x * 2].b = (tag[x * 2].b * tag[x].k + tag[x].b) % mod;
    tag[x * 2 + 1].b = (tag[x * 2 + 1].b * tag[x].k + tag[x].b) % mod;
    sum[x * 2] = (sum[x * 2] * tag[x].k + tag[x].b * llen) % mod;
    sum[x * 2 + 1] = (sum[x * 2 + 1] * tag[x].k + tag[x].b * rlen) % mod;
    tag[x].k = 1;
    tag[x].b = 0;
}

void multiply(int x, int l, int r, int L, int R, ll k)
{
    if (l <= L && R <= r)
    {
        tag[x].b = (tag[x].b * k) % mod;
        tag[x].k = (tag[x].k * k) % mod;
        sum[x] = (sum[x] * k) % mod;
        return;
    }
    int mid = (L + R) / 2;
    if (tag[x].k > 0 || tag[x].b > 0)
        pushdown(x, mid - L + 1, R - mid);
    if (l <= mid)
        multiply(x * 2, l, r, L, mid, k);
    if (r > mid)
        multiply(x * 2 + 1, l, r, mid + 1, R, k);
    sum[x] = (sum[x * 2] + sum[x * 2 + 1]) % mod;
}

void add(int x, int l, int r, int L, int R, ll k)
{
    if (l <= L && R <= r)
    {
        tag[x].b = (tag[x].b + k) % mod;
        sum[x] = (sum[x] + k * (R - L + 1)) % mod;
        return;
    }
    int mid = (L + R) / 2;
    if (tag[x].k > 0 || tag[x].b > 0)
        pushdown(x, mid - L + 1, R - mid);
    if (l <= mid)
        add(x * 2, l, r, L, mid, k);
    if (r > mid)
        add(x * 2 + 1, l, r, mid + 1, R, k);
    sum[x] = (sum[x * 2] + sum[x * 2 + 1]) % mod;
}

ll print(int x, int l, int r, int L, int R)
{
    if (l <= L && R <= r)
        return sum[x] % mod;
    int mid = (L + R) / 2;
    ll res = 0ll;
    if (tag[x].b > 0 || tag[x].k > 0)
        pushdown(x, mid - L + 1, R - mid);
    if (l <= mid)
        res = (res + print(x * 2, l, r, L, mid)) % mod;
    if (mid < r)
        res = (res + print(x * 2 + 1, l, r, mid + 1, R)) % mod;
    return res % mod;
}

int main()
{
    scanf("%d%d%lld", &n, &m, &mod);
    for (int i = 1; i <= n; i++)
        scanf("%lld", &a[i]);

    build(1, 1, n);

    for (int i = 1; i <= m; i++)
    {
        scanf("%d", &c);
        if (c == 1)
        {
            scanf("%d%d%lld", &xx, &yy, &kk);
            multiply(1, xx, yy, 1, n, kk);
        }
        if (c == 2)
        {
            scanf("%d%d%lld", &xx, &yy, &kk);
            add(1, xx, yy, 1, n, kk);
        }
        if (c == 3)
        {
            scanf("%d%d", &xx, &yy);
            printf("%lld\n", print(1, xx, yy, 1, n) % mod);
        }
    } 

    return 0;
}
2022/8/12 09:25
加载中...