求助卡常
查看原帖
求助卡常
252549
Iwara楼主2024/8/30 22:28

RT

#include<bits/stdc++.h>
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
using namespace std;
typedef long long ll;
const ll MAXN=5e5+5,MAXL=1e5+5;
ll n,m;
int a[MAXL];
namespace DSU{
    basic_string<int> S[MAXN],dsu[MAXN];
    inline int find(int num,int now){
        return (now==(int)(dsu[num].size())||now==dsu[num][now])?now:dsu[num][now]=find(num,dsu[num][now]);
    }
}
using DSU::S;
using DSU::dsu;
ll bit[MAXL];
#define lowbit(x) (x&-x)
inline void add(int pos,int num){
	while(pos<=n){
		bit[pos]+=num;
		pos+=lowbit(pos);
	}
	return;
}
inline ll sum(int pos){
	ll ans=0;
	while(pos){
		ans+=bit[pos];
		pos-=lowbit(pos);
	}
	return ans;
}
int op,l,r,x;
inline void update(int L,int R,int X){
	int pos=lower_bound(S[X].begin(),S[X].end(),L)-S[X].begin();
	for(int i=DSU::find(X,pos);i<(int)(S[X].size())&&S[X][i]<=R;i=DSU::find(X,i+1)){
		if(!(a[S[X][i]]%X)){
			add(S[X][i],a[S[X][i]]/X-a[S[X][i]]);
			a[S[X][i]]/=X;
		}
		if(a[S[X][i]]%X)dsu[X][i]=i+1;
	}
    return;
}
inline ll query(int L,int R){
	return sum(R)-sum(L-1);
}
const int Size=(1<<20)+1;
char buf[Size],*p1=buf,*p2=buf;
char buffer[Size];
int op1=-1;
const int op2=Size-1;
inline char readchar() {
	if(p1!=p2) {
		return *p1++;
	}
	return p1==(p2=(p1=buf)+fread(buf,1,Size-1,stdin))?EOF:*p1++;
}
inline void flush() {
	fwrite(buffer,1,op1+1,stdout),op1=-1;
}
inline void writechar(const char &x) {
	if(op1==op2) flush();
	buffer[++op1]=x;
}
#ifndef ONLINE_JUDGE
#define readchar getchar
#endif
#define putchar writechar
inline int read() {
	int s=1,c=readchar(),x=0;
	while(c<=32) {
		c=readchar();
	}
	if(c=='-') {
		s=-1,c=readchar();
	}
	for(; ('0'<=c && c<='9'); c=readchar()) {
		x=x*10+c-'0';
	}
	return x*s;
}
inline void write(long long x) {
	if(x<0) {
		writechar('-'),x=-x;
	}
	char s[25];
	int n=0;
	while(x || !n) {
		s[n++]='0'+x%10,x/=10;
	}
	while(n--) {
		writechar(s[n]);
	}
}
ll lstans;
int qwq;
int qaq[305]={0,2,3,4,5,6,7,8,9,10,11,12,14,15,16,18,20,21,22,24,27,28,30,33,35,36,40,42,44,45,48,54,55,56,60,63,66,70,72,77,80,81,84,88,90,99,105,108,110,112,120,126,132,135,140,144,154,162,165,168,176,180,189,198,210,216,220,231,240,252,264,270,280,297,308,315,324,330,336,360,378,385,396,405,420,432,440,462,495,504,528,540,560,567,594,616,630,648,660,693,720,756,770,792,810,840,880,891,924,945,990,1008,1080,1134,1155,1188,1232,1260,1296,1320,1386,1485,1512,1540,1584,1620,1680,1782,1848,1890,1980,2079,2160,2268,2310,2376,2520,2640,2772,2835,2970,3024,3080,3240,3465,3564,3696,3780,3960,4158,4455,4536,4620,4752,5040,5544,5670,5940,6160,6237,6480,6930,7128,7560,7920,8316,8910,9072,9240,10395,11088,11340,11880,12474,13860,14256,15120,16632,17820,18480,20790,22680,23760,24948,27720,31185,33264,35640,41580,45360,49896,55440,62370,71280,83160,99792,124740,166320,249480,498960};
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		qwq=max(a[i],qwq);
		if(a[i]==498960){
			for(int j=1;j<=200;j++){
				if(!j)continue;
				S[qaq[j]].push_back(i);
				dsu[qaq[j]].push_back(dsu[qaq[j]].size());
			}
			add(i,a[i]);
			continue;
		}
		ll lim=sqrt(a[i]);
		for(int j=1;j<=lim;j++){
			if(!(a[i]%j)){
                if(j>1){
				    S[j].push_back(i);
				    dsu[j].push_back(dsu[j].size());
                }
				if(j*j<a[i]&&a[i]/j>1){
					S[a[i]/j].push_back(i);
					dsu[a[i]/j].push_back(dsu[a[i]/j].size());
				}
			}
		}
		add(i,a[i]);
	}
	for(int i=1;i<=m;i++){
		op=read();
		if(op==1){
			l=read(),r=read(),x=read();
			l^=lstans,r^=lstans,x^=lstans; 
			if(x>1&&x<=qwq)update(l,r,x);
		}
		else{
			l=read(),r=read();
			l^=lstans,r^=lstans; 
			write(lstans=query(l,r));
			putchar('\n');
		}
	}
	flush();
	return 0;
}
2024/8/30 22:28
加载中...