求卡常
查看原帖
求卡常
294562
EDqwq楼主2020/10/27 20:37

怎么乱搞都行谢谢

嗯没错我是第二个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;
}
2020/10/27 20:37
加载中...