社区讨论

玄关卡常

P5610[Ynoi2013] 大学参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mjin32hy
此快照首次捕获于
2025/12/23 21:47
2 个月前
此快照最后确认于
2025/12/26 17:25
2 个月前
查看原帖
C
#include<bits/stdc++.h>
#define endl '\n'
#define debug "-------------------\n"
#define rep(I, A, B) for (int I = (A); I <= (B); I++)
#define dwn(I, A, B) for (int I = (A); I >= (B); I--)
#define ll long long 
using namespace std;
const int INF = 0x3f3f3f3f3f3f3f3f, mod = 998244353;
int add(int a, int b){ a += b; if(a >= mod) a -= mod; return a;}
int sub(int a, int b){ a -= b; if(a < 0) a += mod; return a;}
int mul(int a, int b){ if(b >= mod) b %= mod; if(a >= mod) a %= mod; a *= b; if(a >= mod) a %= mod; return a;}
void Min(int &a, int b){ if(b < a) a = b;}
void Max(int &a, int b){ if(b > a) a = b;}
template <typename T>
inline void read(T &x) {
    x = 0; char c = getchar();
    int f = 0;
    for (; !isdigit(c); c = getchar()) f |= c == '-';
    for (; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
    if (f) x = -x;
}

template <typename T, typename ...Args>
inline void read(T &x, Args &...args) {
    read(x), read(args...);
}
template <typename T>
inline void write(T x, char ch) {
    if (x < 0) x = -x, putchar('-');
    static short st[70], tp;
    do st[++tp] = x % 10, x /= 10; while (x);
    while (tp) putchar(st[tp--] | 48);
    putchar(ch);
}

template <typename T, typename ...Args>
inline void write(T x, char ch, Args ...args) {
    write(x, ch), write(args...);
}

const int N = 5e5 + 5;
int a[N];
struct BIT{
	int n;
	ll t[N];
	#define lowbit(x) ((x)&(-(x)))
	void init(int _n){
		n = _n;
	}
	void add(int i, int v){
		while(i <= n){
			t[i] += v;
			i += lowbit(i);
		}
	}
	ll query(int i){
		ll ans = 0;
		while(i){
			ans += t[i];
			i -= lowbit(i);
		}
		return ans;
	}
}bit;
struct NDS{
	vector<int> fa;
	vector<int> v;
	int find(int x){
		if(x == fa.size() || fa[x] == x) return x;
		return fa[x] = find(fa[x]);
	}
}t[N];
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
//	ios::sync_with_stdio(0);
//	cin.tie(0);
	int n, m;
	read(n, m);
	bit.init(n);
	rep(i, 1, n){
		read(a[i]);
		bit.add(i, a[i]);
		for(int j = 1; j * j <= a[i]; j++){
			if(a[i] % j == 0){
				t[j].v.push_back(i);
				t[j].fa.push_back(t[j].fa.size());
				if(a[i] != j * j){
					t[a[i] / j].v.push_back(i);
					t[a[i] / j].fa.push_back(t[a[i] / j].fa.size());
				}
			}
		}
	}
	ll ans = 0;
	while(m--){
		int op;
		read(op);
		if(op == 1){
			int l, r, x;
			read(l, r, x);
			l ^= ans;
			r ^= ans;
			x ^= ans;
			if(x == 1 || t[x].v.size() == 0) continue;
			int st = t[x].find(lower_bound(t[x].v.begin(), t[x].v.end(), l) - t[x].v.begin());
			for(int i = st; i < t[x].v.size() && t[x].v[i] <= r; i = t[x].find(i + 1)){
				if(a[t[x].v[i]] % x == 0){
					bit.add(t[x].v[i], -(a[t[x].v[i]] - a[t[x].v[i]] / x));
					a[t[x].v[i]] /= x;
				}
				if(a[t[x].v[i]] % x != 0) t[x].fa[i] = i + 1;
			}
 		}else{
			int l, r;
			read(l, r);
			l ^= ans;
			r ^= ans;
			ans = bit.query(r) - bit.query(l - 1);
			write(ans, endl);
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...