Untitled
unknown
c_cpp
9 days ago
3.2 kB
6
Indexable
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(a) a.begin(), a.end()
#define allr(a) a.rbegin(), a.rend()
#define endl '\n'
const int N = 1e4 + 5;
vector<int> spf(N), gpf(N, 1), sm(N);
void sieve() {
for (int i = 2; i < N; i++) {
if (spf[i] == 0) {
for (int j = i; j < N; j += i) {
if (spf[j] == 0)
spf[j] = i;
}
}
}
for (int i=2; i<N; i++) {
int x = i;
while (x > 1) {
sm[i] += spf[x];
gpf[i] = spf[x];
x /= spf[x];
}
}
}
struct node {
int val = 0, ans = 0, lazy = 0;
};
struct segTree {
vector<node>Tree;
int sz;
void propagate(int p, int s, int e) {
if (Tree[p].lazy == 0) return;
if (s != e) {
Tree[2*p].lazy = Tree[2*p+1].lazy = Tree[p].lazy;
}
Tree[p].val = Tree[p].lazy;
Tree[p].ans = sm[Tree[p].lazy] * (e - s + 1);
Tree[p].lazy = 0;
}
void update(int p, int s, int e, int l, int r, int x) {
propagate(p, s, e);
if (l > e || s > r) return;
if (s>=l && e<=r) {
Tree[p].lazy = x;
propagate(p, s, e);
return;
}
int mid = (s + e) / 2;
update(2*p, s, mid, l, r, x);
update(2*p+1, mid+1, e, l, r, x);
Tree[p].ans = Tree[2*p].ans + Tree[2*p+1].ans;
}
pair<ll, int> query(int p, int s, int e, int l, int r) {
propagate(p, s, e);
if (l > e || s > r) return {0LL, 0};
if (s >= l && e <= r) return {Tree[p].ans, Tree[p].val};
int mid = (s + e) / 2;
auto lf = query(2 * p, s, mid, l, r), rg = query(2 * p + 1, mid + 1, e, l, r);
return {lf.first + rg.first, max(lf.second, rg.second)};
}
int query(int l, int r) {
return query(1, 0, sz-1, l, r).first;
}
void update1(int l, int r, int x) {
update(1, 0, sz-1, l, r, x);
}
void update2(int idx) {
int val = query(1, 0, sz-1, idx, idx).second;
update1(idx, idx, val / gpf[val]);
}
segTree(int n) {
sz = n;
Tree.resize(4 * n);
}
};
void solve() {
int n;
cin >> n;
segTree tree(n);
for (int i=0; i<n; i++) {
int x;
cin >> x;
tree.update1(i, i, x);
}
int q;
cin >> q;
while (q--) {
int op;
cin >> op;
if (op == 1) {
int idx;
cin >> idx; idx--;
tree.update2(idx);
}
else if (op == 2) {
int l, r;
cin >> l >> r;
l--; r--;
cout << tree.query(l, r) << endl;
}
else {
int l, r, x;
cin >> l >> r >> x;
l--; r--;
tree.update1(l, r, x);
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
sieve();
int t = 1;
// cin >> t;
while (t--) solve();
}Editor is loading...
Leave a Comment