样例不过,求找茬
查看原帖
样例不过,求找茬
768587
mc360楼主2024/1/4 14:26
#include<bits/stdc++.h>
#define N 100001
using namespace std; 
struct node
{
	long long sum,l,r,f1,f2;
}t[4*N];
long long n,a[N],q,x,y,k,m;
int flag;
void push_down(long long p)
{
	t[p*2].sum=(t[p*2].sum*t[p].f2+t[p].f1*(t[p*2].r-t[p*2].l+1))%m;
	t[p*2+1].sum=(t[p*2+1].sum*t[p].f2+t[p].f1*(t[p*2+1].r-t[p*2+1].l+1))%m;
	t[p*2].f2=(t[p*2].f2*t[p].f2)%m;
	t[p*2+1].f2=(t[p*2+1].f2*t[p].f2)%m;
	t[p*2].f1=(t[p*2].f1*t[p].f2+t[p].f1)%m;
	t[p*2+1].f1=(t[p*2+1].f1*t[p].f2+t[p].f1)%m;
	t[p].f2=1;
	t[p].f1=0;
}
void push_up(long long p)
{
	t[p].sum=(t[p*2].sum+t[p*2+1].sum)%m;
}
void build(long long p,long long l,long long r)
{
	t[p].f1=0;
	t[p].f2=1;
	t[p].l=l,t[p].r=r;
	if(l==r)
	{
		t[p].sum=a[l];
		t[p].sum%=m;
		return ;
	}
	long long mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
	t[p].sum%=m;
}
long long query(long long p,long long l,long long r)
{
	if(t[p].r<l||t[p].l>r) return 0;
	if(t[p].l>=l&&t[p].r<=r)
	{
		return t[p].sum;
	}
	push_down(p);
	return (query(p*2,l,r)+query(p*2+1,l,r))%m;
}
void updata(long long p,long long l,long long r,long long v)
{
	if(t[p].r<l||t[p].l>r) return ;
	if(t[p].l>=l&&t[p].r<=r)
	{
		t[p].f1=(t[p].f1+v)%m;
		t[p].sum=(t[p].sum+(t[p].r-t[p].l+1)*v)%m;
		return ;
	}
	push_down(p);
	updata(p*2,l,r,v);
	updata(p*2+1,l,r,v);
	push_up(p);
}
void upupdata(long long p,long long l,long long r,long long v)
{
	if(t[p].r<l||t[p].l>r) return ;
	if(t[p].l>=l&&t[p].r<=r)
	{
		t[p].sum=(t[p].sum*v)%m;
		t[p].f2=(t[p].f2*v)%m;
		t[p].f1=(t[p].f1*v)%m;
		return ;
	}
	push_down(p);
	updata(p*2,l,r,v);
	updata(p*2+1,l,r,v);
	push_up(p);
}
int main()
{
	ios::sync_with_stdio(0);
	cout.tie(0);
	cin.tie(0);
	cin >> n >> q >> m;
	for(long long i=1;i <=n;i++)
		cin >> a[i];
	build(1,1,n);
	for(long long i=1;i <=q;i++)
	{
		cin >> flag >> x >> y;
		if(flag==1)
		{
//			cout << endl;
//			for(int i=1;i <= 9;i++)
//				cout << i << ' ' << t[i].sum << ' ' << t[i].f1 << ' ' << t[i].f2 << endl;
//			cout << "OVER" << endl << endl;
			cin >> k;
			upupdata(1,x,y,k);
//			cout << endl;
//			for(int i=1;i <= 9;i++)
//				cout << i << ' ' << t[i].sum << ' ' << t[i].f1 << ' ' << t[i].f2 << endl;
//			cout << "OVER" << endl << endl;
		}
		else if(flag==2)
		{
			cin >> k;
			updata(1,x,y,k);
		}
//		else
//			cout << query(1,x,y) << endl;
	}
	return 0;
}
2024/1/4 14:26
加载中...