萌新求助神秘re
查看原帖
萌新求助神秘re
468657
lsj2009Isj2OO9楼主2024/7/12 15:38

record:https://www.luogu.com.cn/record/165504502。

code:

#include<bits/stdc++.h>
//#pragma GCC optimize(3,"Ofast","inline")
//#define int long long
#define ll long long
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
using namespace std;
void file_IO() {
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
}
bool M1;
namespace IO {
	char Is[(1<<21)+10],Os[(1<<21)+10];
	int Ipt,Opt;
	char gc() {
		if(Ipt==1<<21)
			Ipt=0;
		if(!Ipt)
			Is[fread(Is,1,1<<21,stdin)]=0;
		return Is[Ipt++];
	}
	void flush() {
		fwrite(Os,1,Opt,stdout);
		Opt=0;
	}
	void pc(char x) {
		if(Opt==1<<21)
			flush();
		Os[Opt++]=x;
	}
	ll read() {
		ll x=0;
		char ch=gc();
		while(ch<'0'||ch>'9')
			ch=gc();
		while(ch<='9'&&ch>='0')
			x=x*10+ch-48,ch=gc();
		return x;
	}
	int t[20];
	void write(ll x) {
		if(x<0)
			pc('-'),x=-x;
		if(!x) {
			pc('0');
			return;
		}
		int len=0;
		while(x)
			t[++len]=x%10,x/=10;
		per(i,len,1)
			pc(t[i]+48);
	}
}
using namespace IO;
const int N=1e5+5,M=5e5+5,m=5e5;
int a[N],n,q;
struct BIT {
	ll tree[N];
	void update(register int x,const register int &k) {
		while(x<=n)
			tree[x]+=k,x+=x&-x;
	}
	ll query(register int x) {
		ll res=0;
		while(x)
			res+=tree[x],x-=x&-x;
		return res;
	}
	ll query(const register int &l,const register int &r) {
		return query(r)-query(l-1);
	}
}; BIT T;
vector<int> vec[M],fa[M];
int f[M];
int find(const register int &d,const register int &x) {
	if(fa[d][x]!=x)
		fa[d][x]=find(d,fa[d][x]);
	return fa[d][x];
}
void ins(const register int &d,const register int &x) {
	fa[d].push_back(f[d]);
	vec[d].push_back(x);
	++f[d];
}
void del(int l,const register int &r,const register int &d) {
	l=lower_bound(vec[d].begin(),vec[d].end(),l)-vec[d].begin();
	int len=f[d];
	if(l==len)
		return;
	for(int i=find(d,l);i<len&&vec[d][i]<=r;i=find(d,i+1)) {
		int &x=a[vec[d][i]];
		if(x%d==0) {
			T.update(vec[d][i],x/d-x);
			x/=d;
		}
		if(i==len-1)
			return;
		if(x%d!=0)
			fa[d][i]=i+1;
	}
}
vector<int> c[M];
void solve() {
	n=read(); q=read();
	int mx=0;
	rep(i,1,n) {
		a[i]=read();
		if(a[i]>mx)
			mx=a[i];
		c[a[i]].push_back(i);
		T.update(i,a[i]);
	}
	rep(i,2,mx) {
		rep(j,1,mx/i) {
			for(auto x:c[i*j])
				ins(i,x);
		}
	}
	ll ans=0;
	while(q--) {
		ll op=read(),l=read(),r=read();
		l^=ans; r^=ans;
		if(op==1) {
			ll x=read();
			x^=ans;
			if(x>1&&x<=mx)
				del(l,r,x);
		} else
			write(ans=T.query(l,r)),pc('\n');
	}
	flush();
}
bool M2;
signed main() {
	//file_IO();
	int testcase=1;
	//scanf("%d",&testcase);
	while(testcase--)
		solve();
	cerr<<"used time = "<<1000*clock()/CLOCKS_PER_SEC<<"ms\n";
	cerr<<"used memory = "<<(&M1-&M2)/1024/1024<<"MB\n";
	return 0;
}
2024/7/12 15:38
加载中...