HDU4578线段树求调,悬赏关注
查看原帖
HDU4578线段树求调,悬赏关注
575363
revolutionary_oier楼主2024/5/27 19:00
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int maxn=4e5+10;
const int mod=1e4+7;
int n,m;
struct node{
	int l,r;
	int sum1,sum2,sum3;
	int ps,tm,cg;
}t[maxn<<2];
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
		s=s*10+ch-'0';
		ch=getchar();
	}
    return s*w;
}
inline void write(int a){
    if(a>9) write(a/10);
    putchar(a%10+'0');
}
inline void upd(int i){
	t[i].sum1=(t[i<<1].sum1+t[i<<1|1].sum1)%mod;
	t[i].sum2=(t[i<<1].sum2+t[i<<1|1].sum2)%mod;
	t[i].sum3=(t[i<<1].sum3+t[i<<1|1].sum3)%mod;
}
inline void build(int i,int l,int r){
	t[i].l=l,t[i].r=r;
	t[i].sum1=t[i].sum2=t[i].sum3=0;
	t[i].ps=t[i].tm=t[i].cg=0;
	if(l==r)return ;
	int mid=l+r>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
}
inline void pushdown(int i){
	if(t[i].cg!=0){
		t[i<<1].ps=t[i<<1].tm=0,t[i<<1].cg=t[i].cg;
		t[i<<1].sum1=t[i].cg*(t[i<<1].r-t[i<<1].l+1)%mod;
		t[i<<1].sum2=t[i].cg*t[i].cg%mod*(t[i<<1].r-t[i<<1].l+1)%mod;
		t[i<<1].sum3=t[i].cg*t[i].cg%mod*t[i].cg%mod*(t[i<<1].r-t[i<<1].l+1)%mod;
		
		t[i<<1|1].ps=t[i<<1|1].tm=0,t[i<<1|1].cg=t[i].cg;
		t[i<<1|1].sum1=t[i].cg*(t[i<<1|1].r-t[i<<1|1].l+1)%mod;
		t[i<<1|1].sum2=t[i].cg*t[i].cg%mod*(t[i<<1|1].r-t[i<<1|1].l+1)%mod;
		t[i<<1|1].sum3=t[i].cg*t[i].cg%mod*t[i].cg%mod*(t[i<<1|1].r-t[i<<1|1].l+1)%mod;
		
		t[i].cg=0;
	}
	if(t[i].tm!=0){
		t[i<<1].tm=(t[i<<1].tm*t[i].tm)%mod;
		t[i<<1].ps=(t[i<<1].ps*t[i].tm)%mod;
		t[i<<1].sum1=t[i].tm*t[i<<1].sum1%mod;
		t[i<<1].sum2=t[i].tm*t[i].tm%mod*t[i<<1].sum2%mod;
		t[i<<1].sum3=t[i].tm*t[i].tm%mod*t[i].tm%mod*t[i<<1].sum3%mod;
		
		t[i<<1|1].tm=(t[i<<1|1].tm*t[i].tm)%mod;
		t[i<<1|1].ps=(t[i<<1|1].ps*t[i].tm)%mod;
		t[i<<1|1].sum1=t[i].tm*t[i<<1|1].sum1%mod;
		t[i<<1|1].sum2=t[i].tm*t[i].tm%mod*t[i<<1|1].sum2%mod;
		t[i<<1|1].sum3=t[i].tm*t[i].tm%mod*t[i].tm%mod*t[i<<1|1].sum3%mod;
		
		t[i].tm=0;
	}
	if(t[i].ps!=0){
		int p=t[i<<1].sum1;
		int q=t[i<<1].sum2;
		t[i<<1].ps=(t[i<<1].ps+t[i].ps)%mod;
		t[i<<1].sum1=(t[i<<1].sum1+t[i].ps*(t[i<<1].r-t[i<<1].l+1)%mod)%mod;
		t[i<<1].sum2=(t[i<<1].sum2+2*t[i].ps%mod*p%mod+t[i].ps*t[i].ps%mod*(t[i<<1].r-t[i<<1].l+1)%mod)%mod;
		t[i<<1].sum3=(t[i<<1].sum3+3*t[i].ps%mod*q%mod+3*t[i].ps%mod*t[i].ps*p%mod+t[i].ps*t[i].ps%mod*t[i].ps%mod*(t[i<<1].r-t[i<<1].l+1)%mod)%mod;
		
		p=t[i<<1|1].sum1;
		q=t[i<<1|1].sum2;
		t[i<<1|1].ps=(t[i<<1|1].ps+t[i].ps)%mod;
		t[i<<1|1].sum1=(t[i<<1|1].sum1+t[i].ps*(t[i<<1|1].r-t[i<<1|1].l+1)%mod)%mod;
		t[i<<1|1].sum2=(t[i<<1|1].sum2+2*t[i].ps*p%mod+t[i].ps*t[i].ps*(t[i<<1|1].r-t[i<<1|1].l+1)%mod)%mod;
		t[i<<1|1].sum3=(t[i<<1|1].sum3+3*t[i].ps*q%mod+3*t[i].ps*t[i].ps*p%mod+t[i].ps*t[i].ps*t[i].ps*(t[i<<1|1].r-t[i<<1|1].l+1)%mod)%mod;
	
		t[i].ps=0;
	}
} 
inline void change1(int i,int l,int r,int x){
	if(t[i].l>r||t[i].r<l)return ;
	if(l<=t[i].l&&t[i].r<=r){
		t[i].ps=(t[i].ps+x)%mod;
		int p=t[i].sum1;
		int q=t[i].sum2;
		t[i].sum1=(t[i].sum1+x*(t[i].r-t[i].l+1)%mod)%mod;
		t[i].sum2=(t[i].sum2+2*x%mod*p%mod+x*x%mod*(t[i].r-t[i].l+1)%mod)%mod;
		t[i].sum3=(t[i].sum3+3*x%mod*q%mod+3*x%mod*x%mod*p%mod+x*x%mod*x%mod*(t[i].r-t[i].l+1)%mod)%mod;
		return ;
	}
	pushdown(i);
	change1(i<<1,l,r,x);
	change1(i<<1|1,l,r,x);
	upd(i);
}
inline void change2(int i,int l,int r,int x){
	if(t[i].l>r||t[i].r<l)return ;
	if(l<=t[i].l&&t[i].r<=r){
		int p=t[i].sum1;
		int q=t[i].sum2;
		t[i].tm=(t[i].tm*x)%mod;
		t[i].ps=(t[i].ps*x)%mod;
		t[i].sum1=x*t[i].sum1%mod;
		t[i].sum2=t[i].sum2*x%mod*x%mod;
		t[i].sum3=t[i].sum3*x%mod*x%mod*x%mod;
		return ;
	}
	pushdown(i);
	change2(i<<1,l,r,x);
	change2(i<<1|1,l,r,x);
	upd(i);
}
inline void change3(int i,int l,int r,int x){
	if(t[i].l>r||t[i].r<l)return ;
	if(l<=t[i].l&&t[i].r<=r){
		int p=t[i].sum1;
		int q=t[i].sum2;
		t[i].tm=0,t[i].ps=0,t[i].cg=x;
		t[i].sum1=(t[i].r-t[i].l+1)*x%mod;
		t[i].sum2=(t[i].r-t[i].l+1)*x%mod*x%mod;
		t[i].sum3=(t[i].r-t[i].l+1)*x%mod*x%mod*x%mod;
		return ;
	}
	pushdown(i);
	change3(i<<1,l,r,x);
	change3(i<<1|1,l,r,x);
	upd(i);
}
inline int query1(int i,int l,int r){
	if(t[i].l>r||t[i].r<l)return 0;
	if(l<=t[i].l&&t[i].r<=r)return t[i].sum1;
	pushdown(i);
	int p=(query1(i<<1,l,r)+query1(i<<1|1,l,r))%mod;
	return p;
}
inline int query2(int i,int l,int r){
	if(t[i].l>r||t[i].r<l)return 0;
	if(l<=t[i].l&&t[i].r<=r)return t[i].sum2;
	pushdown(i);
	int p=(query2(i<<1,l,r)+query2(i<<1|1,l,r))%mod;
	return p;
}
inline int query3(int i,int l,int r){
	if(t[i].l>r||t[i].r<l)return 0;
	if(l<=t[i].l&&t[i].r<=r)return t[i].sum3;
	pushdown(i);
	int p=(query3(i<<1,l,r)+query3(i<<1|1,l,r))%mod;
	return p;
}
inline void solve(){
	build(1,1,n);
	while(m--){
		int op,l,r,x;
		op=read(),l=read(),r=read(),x=read();
		if(op==1)change1(1,l,r,x);
		else if(op==2)change2(1,l,r,x);
		else if(op==3)change3(1,l,r,x);
		else {
			if(x==1)write(query1(1,l,r)),printf("\n");
			else if(x==2)write(query2(1,l,r)),printf("\n");
			else write(query3(1,l,r)),printf("\n");
		}
//		printf("= %lld %lld %lld\n",t[1].sum1,t[1].sum2,t[1].sum3);
	}
//	printf("\n");
}
signed main(){
	while(1){
		n=read(),m=read();
		if(n==0&&m==0)return 0;
		solve();
	}
	return 0;
}
2024/5/27 19:00
加载中...