玄关!0分wa求调
查看原帖
玄关!0分wa求调
813920
turt1e楼主2024/9/23 21:47

蒟蒻实在看不出来有什么问题,求调

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;

int n, q, m;
int t[N << 2], a[N], b[N], c[N];
int ls(int p) {return p << 1;}
int rs(int p) {return p << 1 | 1;}

void build(int l, int r, int p)
{
    if(l == r) 
    {
        t[p] = a[l] % m;
        return;    
    }
    int mid = l + r >> 1;
    build(l, mid, ls(p));
    build(mid + 1, r, rs(p));
    t[p] = (t[ls(p)] + t[rs(p)]) % m;

}
void pushdown(int l, int r, int p)
{
    int mid = l + r >> 1;
    t[ls(p)] = (b[p] * t[ls(p)] + c[p] * (mid - l + 1)) % m;
    t[rs(p)] = (b[p] * t[rs(p)] + c[p] * (r - mid)) % m;
    b[ls(p)] = (b[ls(p)] * b[p]) % m;
    b[rs(p)] = (b[rs(p)] * b[p]) % m;
    c[ls(p)] = (c[ls(p)] * b[p] + c[p]) % m;
    c[rs(p)] = (c[rs(p)] * b[p] + c[p]) % m;
    b[p] = 1;
    c[p] = 0;
    t[p] = (t[ls(p)] + t[rs(p)]) % m;
}

void multi(int l, int r, int x, int y, int k, int p)
{
    if(y < l || x > r) return;
    if(x <= l && r <= y)
    {
        t[p] = (t[p] * k) % m;
        b[p] = (b[p] * k) % m;
        c[p] = (c[p] * k) % m;
        return;
    }
    pushdown(l, r, p);
    int mid = l + r >> 1;
    multi(l, mid, x, y, k, ls(p));
    multi(mid + 1, r, x, y, k, rs(p));
    t[p] = (t[ls(p)] + t[rs(p)]) % m;
    return;
}
void add(int l, int r, int x, int y, int k, int p)
{
    if(y < l || x > r) return;
    if(x <= l && r <= y)
    {
        c[p] = (c[p] + k) % m;
        t[p] = (t[p] + k * (r - l + 1)) % m;
        return;
    }
    pushdown(l, r, p);
    int mid = l + r >> 1;
    add(l, mid, x, y, k, ls(p));
    add(mid + 1, r, x, y, k, rs(p));
    t[p] = (t[ls(p)] + t[rs(p)]) % m;
    return;
}
int query(int l, int r, int x, int y, int p)
{
    if(y < l || x > r) return 0;
    if(x <= l && r <= y)
    {
        return t[p];
    }
    pushdown(l, r, p);
    int mid = l + r >> 1;
    return (query(l, mid, x, y, ls(p)) + query(mid + 1, r, x, y, rs(p))) % m;

}

signed main()
{
    cin >> n >> q >> m;
    memset(b, 1, sizeof b);
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    build(1, n, 1);
    while(q--)
    {
        int op;
        cin >> op;
        if(op == 1)
        {
            int x, y, k;
            cin >> x >> y >> k;
            multi(1, n, x, y, k, 1);
        }
        else if(op == 2)
        {
            int x, y, k;
            cin >> x >> y >> k;
            add(1, n, x, y, k, 1);
        }
        else
        {
            int x, y;
            cin >> x >> y;
            cout << query(1, n, x, y, 1) % m << endl;
        }
    }

}
2024/9/23 21:47
加载中...