萌新刚学线段树,求调
  • 板块灌水区
  • 楼主Surge_of_Force
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/11/23 10:12
  • 上次更新2023/11/3 23:42:47
查看原帖
萌新刚学线段树,求调
230875
Surge_of_Force楼主2021/11/23 10:12

线段树二:

#include<bits/stdc++.h>
#define ll long long
#define int long long
const int MAX=1e5+10;
const int MOD=571373;
using namespace std;
inline int read() {
  int fh = 1, res = 0; char ch = getchar();
  for(; !isdigit(ch); ch = getchar()) if(ch == '-') fh = -1;
  for(; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ '0');
  res = res * fh;
  return res;
}
inline void write(ll x) {
	if(x<0){putchar('-');x=-x;}
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
struct tree{int l,r,w,f1,f2;}a[MAX<<2];
int ans;
inline int lc(int k){return k<<1;}
inline int rc(int k){return k<<1|1;}
inline void build(int k,int l,int r)
{
	a[k].l=l;a[k].r=r;
	a[k].f1=1; 
	if(l==r)
	{
		a[k].w=read();
		return ;
	}
	int mid=(l+r)>>1;
	build(lc(k),l,mid);
	build(rc(k),mid+1,r);
	a[k].w=a[lc(k)].w+a[rc(k)].w;
}	
inline void down(int k)
{
	a[lc(k)].f1=(a[lc(k)].f1*a[k].f1)%MOD;
	a[rc(k)].f1=(a[rc(k)].f1*a[k].f1)%MOD;
	a[lc(k)].f2=(a[lc(k)].f2*a[k].f1+a[k].f2)%MOD;
	a[rc(k)].f1=(a[rc(k)].f2*a[k].f1+a[k].f2)%MOD;
	a[lc(k)].w=(a[lc(k)].w*a[k].f1+a[k].f2*(a[lc(k)].r-a[lc(k)].l+1))%MOD;
	a[rc(k)].w=(a[rc(k)].w*a[k].f1+a[k].f2*(a[rc(k)].r-a[rc(k)].l+1))%MOD;
	a[k].f1=1;
	a[k].f2=0;
	return ;
}
inline void ask(int k,int x,int y)
{
	if(x<=a[k].l&&y>=a[k].r)
	{
		ans=(ans+a[k].w)%MOD;
		return ;
	}
	if(a[k].f1||a[k].f2) down(k);
	int m=(a[k].l+a[k].r)>>1;
	if(x<=m) ask(lc(k),x,y);
	if(y>=m+1) ask(rc(k),x,y);
}
inline void change1(int x,int y,int z,int k)
{
	if(x<=a[k].l&&y>=a[k].r)
	{
		a[k].w=(a[k].w+(a[k].r-a[k].l+1)*z)%MOD;
		a[k].f2=(a[k].f2+z)%MOD;
		return ;
	}
	if(a[k].f1||a[k].f2) down(k);
	int m=(a[k].l+a[k].r)>>1;
	if(x<=m) change1(x,y,z,lc(k));
	if(y>=m+1) change1(x,y,z,rc(k));
	a[k].w=a[lc(k)].w+a[rc(k)].w;
}
inline void change2(int x,int y,int z,int k)
{
	if(x<=a[k].l&&y>=a[k].r)
	{
		a[k].w=(a[k].w*z)%MOD;
		a[k].f1=(a[k].f1*z)%MOD;
		return ;
	}
	if(a[k].f1) down(k);
	int m=(a[k].l+a[k].r)>>1;
	if(x<=m) change2(x,y,z,lc(k));
	if(y>=m+1) change2(x,y,z,rc(k));
	a[k].w=a[lc(k)].w+a[rc(k)].w;
}
signed main()
{
	int n=read(),m=read();
	build(1,1,n);
	while(m--)
	{
		int op=read();
		if(op==1)
		{
			int x=read(),y=read(),k=read();
			change1(x,y,k,1);
		}
		if(op==2)
		{
			int x=read(),y=read(),k=read();
			change2(x,y,k,1);
		}
		if(op==3)
		{
			int x=read(),y=read();
			ans=0;
			ask(1,x,y);
			write(ans%MOD);
			putchar('\n');
		}
	} 
	return 0;
}
2021/11/23 10:12
加载中...