CF438D 线段树 Wa#4 求调
  • 板块学术版
  • 楼主Crazyouth
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/18 23:29
  • 上次更新2023/11/3 09:00:00
查看原帖
CF438D 线段树 Wa#4 求调
766339
Crazyouth楼主2023/7/18 23:29

rt。

#include <bits/stdc++.h>
using namespace std;
long long d[int(4e5+10)],maxx[int(4e5+10)],a[int(1e5+10)];
void build(int s,int t,int p)
{
	if(s==t)
	{
		d[p]=maxx[p]=a[s];
		return;
	}
	int m=(s+t)>>1;
	build(s,m,p*2);
	build(m+1,t,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
	maxx[p]=max(maxx[p*2],maxx[p*2+1]);
}
void mod(int l,int r,int s,int t,int p,long long x)
{
	if(maxx[p]<x&&l<=s&&t<=r) return;
	if(l<=s&&t<=r&&s==t)
	{
		d[p]%=x;
		maxx[p]%=x;
		return;
	}
	int m=(s+t)>>1;
	if(l<=m) mod(l,r,s,m,p*2,x);
	if(m<r) mod(l,r,m+1,t,p*2+1,x);
	d[p]=d[p*2]+d[p*2+1];
	maxx[p]=max(maxx[p*2],maxx[p*2+1]);
}
void update(int k,int s,int t,int p,long long x)
{
	if(k==s&&k==t)
	{
		d[p]=maxx[p]=x;
		return;
	}
	int m=(s+t)>>1;
	if(k<=m) update(k,s,m,p*2,x);
	else update(k,m+1,t,p*2+1,x);
	d[p]=d[p*2]+d[p*2+1];
	maxx[p]=max(maxx[p*2],maxx[p*2+1]);
}
long long query(int l,int r,int s,int t,int p)
{
	if(l<=s&&t<=r)
	{
		return d[p];
	}
	int m=(s+t)>>1;
	long long ans=0;
	if(l<=m) ans+=query(l,r,s,m,p*2);
	if(r>m) ans+=query(l,r,m+1,t,p*2+1);
	return ans;
}
int main()
{
	long long n,m,opt,l,r,x;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=m;i++)
	{
		cin>>opt>>l>>r;
		if(l>r) swap(l,r);
		if(opt==1)
		{
			cout<<query(l,r,1,n,1)<<endl;
		}
		else if(opt==2)
		{
			cin>>x;
			mod(l,r,1,n,1,x);
		}
		else
		{
			update(l,1,n,1,r);
		}
	}
	return 0;
}
2023/7/18 23:29
加载中...