线段树2,求调
  • 板块灌水区
  • 楼主hwwqy
  • 当前回复9
  • 已保存回复9
  • 发布时间2021/8/7 22:11
  • 上次更新2023/11/4 11:40:57
查看原帖
线段树2,求调
363669
hwwqy楼主2021/8/7 22:11
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1000005;
ll a[N],sum[N << 2],tag[N << 2],tagc[N<<2];
ll p;
void update(ll x,ll L,ll R) {
    if(L != R) 
	{
		sum[x] = sum[x << 1] + sum[x << 1 | 1];
    }
}
void build(ll x,ll L,ll R) {
	tagc[(L+R)>>1]=1;
    if(L == R) {
		tagc[x]=1;
		sum[x]=a[L];
		sum[x]%=p;
        return;
    }
    ll mid = (L + R) >> 1;
    build(x << 1, L, mid);
    build(x << 1 | 1, mid + 1, R);
    update(x, L, R);
}


void pushdown(int x, int L, int R) {
    if(tag[x] == 0) return;
    int mid = L + R >> 1;
    if(L != R) {
        tagc[x << 1] = tagc[x << 1] * tagc[x] % p;
        tag[x << 1] = (tag[x << 1] * tagc[x] + tag[x]) % p;
        sum[x << 1] = (sum[x << 1] * tagc[x] + tag[x] * (mid - L + 1)) % p;
        tagc[x << 1 | 1] = tagc[x << 1 | 1] * tagc[x] % p;
        tag[x << 1 | 1] = (tag[x << 1 | 1] * tagc[x] + tag[x]) % p;
        sum[x << 1 | 1] = (sum[x << 1 | 1] * tagc[x] + tag[x] * (R - mid)) % p;
    }
    tagc[x] = tag[x] = 0;
}
// a[l...r] += v
void modify(ll x,ll L,ll R,ll l,ll r,ll v) {
    pushdown(x, L, R);
    if(L == l && R == r) {
        tag[x] += v;
        tag[x]%=p;
        sum[x] += v * (R - L + 1);
        sum[x]%=p;
        return;
    }
    ll mid = (L + R) >> 1;
    if(r <= mid) modify(x << 1, L, mid, l, r, v);
    else if(l > mid) modify(x << 1 | 1, mid+1, R, l, r, v);
    else{
        modify(x << 1, L, mid, l, mid, v);
        modify(x << 1 | 1, mid+1, R, mid+1, r, v);
    }
    update(x, L, R);
}
void cmodify(ll x,ll L,ll R,ll l,ll r,ll v) {
    pushdown(x, L, R);
    if(L == l && R == r) {
        tagc[x] *= v;
        tagc[x]%=p;
        tag[x] *= v;
        tag[x]%=p;
        sum[x] *=v;
        sum[x]+=tag[x];
        sum[x]%=p;
        return;
    }
    ll mid = (L + R) >> 1;
    if(r <= mid) cmodify(x << 1, L, mid, l, r, v);
    else if(l > mid) cmodify(x << 1 | 1, mid+1, R, l, r, v);
    else{
        cmodify(x << 1, L, mid, l, mid, v);
        cmodify(x << 1 | 1, mid+1, R, mid+1, r, v);
    }
    update(x, L, R);
}
long long query_sum(ll x,ll L,ll R,ll l,ll r) {
    pushdown(x, L, R);
	// cout << L<<" "<<R<<" "<<sum[x]<<" "<<tag[x]<<endl;
    if(l == L && r == R) return sum[x];
    ll mid = (L + R) >> 1;
    if(r <= mid) return query_sum(x << 1, L, mid, l, r);
    else if(l > mid) return query_sum(x << 1 | 1, mid + 1, R, l, r);
    else{
        ll u = query_sum(x << 1, L, mid, l, mid);
        ll v = query_sum(x << 1 | 1, mid + 1, R, mid + 1, r);
        return (u+v)%p;
    }
}


int main()
{
	ll n,M;
	scanf("%lld%lld%lld",&n,&M,&p);
	for(ll i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	ll cmd,x,y,v;
	while(M--)
	{
		scanf("%lld",&cmd);
		if(cmd==1)
		{
			scanf("%lld%lld%lld",&x,&y,&v);
			cmodify(1,1,n,x,y,v);
		}
		else if(cmd==2)
		{
			scanf("%lld%lld%lld",&x,&y,&v);
			modify(1,1,n,x,y,v);
		}
		else
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query_sum(1,1,n,x,y));
		}
		/*for(ll i=1;i<=n;i++)
		{
			cout<<
		}*/
	}
    return 0;
}

样例已过
分数0分
已经调了一个下午了px

2021/8/7 22:11
加载中...