怎么乱搞都行谢谢
嗯没错我是第二个Reaper
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll read(){
ll 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;
}
void write(ll x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9)write(x / 10);
putchar(x % 10 + '0');
}
int n,m;
int a[500010];
ll tree[500010];
ll lastans;
vector <int> pre[500010],num[500010];
//
int find(int x,int y){
if(y == (int)pre[x].size() || y == pre[x][y])return y;
return pre[x][y] = find(x,pre[x][y]);
}
//
int lowbit(int x){
return x & (-x);
}
void update(int x,ll y){
for(;x <= n;x += lowbit(x)){
tree[x] += y;
}
}
ll query(int x){
ll s = 0;
for(;x > 0;x -= lowbit(x))s += tree[x];
return s;
}
//
void init(){
for(int i = 1;i <= n;i ++){
for(int j = 1;j * j <= a[i];j ++){
if(a[i] % j == 0){
num[j].push_back(i);
pre[j].push_back(pre[j].size());
if(j * j < a[i]){
num[a[i] / j].push_back(i);
pre[a[i] / j].push_back(pre[a[i] / j].size());
}
}
}
}
}
//
void query1(int l,int r,int x){
int xx = lower_bound(num[x].begin(),num[x].end(),l) - num[x].begin();
int tmp = find(x,xx);
for(int i = tmp;i < (int)num[x].size() && num[x][i] <= r;i = find(x,i + 1)){
if(a[num[x][i]] % x == 0){
update(num[x][i],-a[num[x][i]]);
update(num[x][i],a[num[x][i]] / x);
a[num[x][i]] /= x;
}
if(a[num[x][i]] % x != 0)pre[x][i] = i + 1;
}
}
//
signed main(){
cin>>n>>m;
for(int i = 1;i <= n;i ++){
int x;
x = read();
a[i] = x;
update(i,x);
}
init();
for(int i = 1;i <= m;i ++){
int op;
ll l,r,x;
op = read();
if(op == 1){
l = read();
r = read();
x = read();
l = l ^ lastans;
r = r ^ lastans;
x = x ^ lastans;
if(x == 1)continue;
query1(l,r,x);
}
else {
l = read();
r = read();
l = l ^ lastans;
r = r ^ lastans;
lastans = query(r) - query(l - 1);
write(lastans);
printf("\n");
}
}
return 0;
}