各位大佬,帮帮蒟蒻吧qwq
查看原帖
各位大佬,帮帮蒟蒻吧qwq
1411206
kuromi905楼主2025/1/17 09:17
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
struct stu
{
    int left , right;
    int lazy , data;
    int ans;
}tree[N << 2];
int n , p;
int a[N];
void build(int l , int r , int i)
{
    tree[i] = {l , r , 0 , 0 , 1};
    if (l == r)
	{
        tree[i].ans = a[l];
        return ;
    }
    int mid = l + r >> 1;
    build(l , mid , i << 1);
    build(mid + 1 , r , i << 1 | 1);
    tree[i].data = (tree[i << 1].data + tree[i << 1 | 1].data) %  p;
}
void pushdown(int i)
{
    int mul = tree[i].ans;
	int add = tree[i].lazy;
    tree[i << 1].data = (tree[i << 1].data * mul + (tree[i << 1].right - tree[i << 1].left + 1) * add) % p;
    tree[i << 1 | 1].data = (tree[i << 1 | 1].data * mul + (tree[i << 1 | 1].right - tree[i << 1 | 1].left + 1) * add) % p;
    tree[i << 1].ans = (tree[i << 1].ans * mul) % p;
    tree[i << 1 | 1].ans = (tree[i << 1 | 1].ans * mul) % p;
    tree[i << 1].lazy = (tree[i << 1].lazy * mul + add) % p;
    tree[i << 1 | 1].lazy = (tree[i << 1 | 1].lazy * mul + add) % p;
    tree[i].ans = 1;
	tree[i].lazy = 0;
}
void modify(int l , int r , int k , int op , int i){
    if (l <= tree[i].left && tree[i].right <= r)
	{
        if (op != 0)
		{
			tree[i].data = (tree[i].data * k) % p;
			tree[i].ans = (tree[i].ans * k) % p;
			tree[i].lazy = (tree[i].lazy * k) % p; 
        }
		else
		{
            tree[i].data = (tree[i].data + (tree[i].right - tree[i].left + 1) * k) % p;
            tree[i].lazy = (tree[i].lazy + k) % p;
        }
        return ;
    }
    pushdown(i);
    int mid = tree[i].left + tree[i].right >> 1;
    if (l <= mid)
	{
		modify(l , r , k , op , i << 1);	
	}
    if (mid < r)
	{
		modify(l , r , k , op , i << 1 | 1);
	}
	tree[i].data = (tree[i << 1].data + tree[i << 1 | 1].data) % p;
}
int query(int l , int r , int i)
{
    if (l <= tree[i].left && tree[i].right <= r)
	{
        return tree[i].data % p;
    }
    pushdown(i);
    int mid = tree[i].left + tree[i].right >> 1;
    int ans = 0;
    if (l <= mid)
	{
		ans = (ans + query(i << 1 , l , r)) % p;
	}
    if (mid < r)
	{
		ans = (ans + query(i << 1 | 1 , l , r)) % p;
	}
    return ans % p;
}
signed main()
{
	cin >> n >> p;
    for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
    }
    build(1 , n , 1);
    int m;
    cin >> m;
    int op,l,r,k;
    while (m--)
    {
    	int op , l , r;
    	cin >> op >> l >> r;
        if (op == 1)
		{
			int k;
			cin >> k;
            modify(l , r , k , 1 , 1);
        }
		else if (op == 2)
		{
			int k;
			cin >> k;
            modify(l , r , k , 0 , 1);
        }
		else
		{
			cout << (query(l , r , 1)) % p << endl;
        }
    }
    return 0;
}
2025/1/17 09:17
加载中...