社区讨论
玄关卡常
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 条回复,欢迎继续交流。
正在加载回复...