社区讨论
求调线段树 抓个好心人
CF920FSUM and REPLACE参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lxeso5gc
- 此快照首次捕获于
- 2024/06/14 22:39 2 年前
- 此快照最后确认于
- 2024/06/15 10:50 2 年前
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10;
const int M = 1e6;
struct node {
int sum, maxx;
}tree[N << 2];
int a[N], t[N];
void build(int i, int l, int r) {
if (l == r) {
tree[i].sum = a[l];
tree[i].maxx = a[l];
return;
}
int mid = (l + r) / 2;
build(i << 1, l, mid);
build(i << 1 | 1, mid + 1, r);
tree[i].sum = tree[i << 1].sum + tree[i << 1 | 1].sum;
tree[i].maxx = max (tree[i << 1].maxx, tree[i << 1 | 1].maxx);
return;
}
void update (int i, int lx, int rx, int x, int k) {
if (tree[i].maxx <= 2) {
return;
}
if (lx == rx) {
a[lx] = t[a[lx]];
tree[i].sum = tree[i].maxx = a[lx];
return;
}
int mid = (lx + rx) >> 1;
if (x <= mid) {
update(i << 1, lx, mid, x, k);
} else if (x > mid) {
update(i << 1 | 1, mid + 1, rx, x, k);
}
tree[i].sum = tree[i << 1].sum + tree[i << 1 | 1].sum;
tree[i].maxx = max (tree[i << 1].maxx, tree[i << 1 | 1].maxx);
}
int query(int i, int lx, int rx, int l, int r) {
if (l <= lx && rx <= r) {
return tree[i].sum;
}
int mid = (lx + rx) >> 1;
int ans = 0;
if (l <= mid) {
ans += query(i << 1, lx, mid, l, r);
}
if (r > mid) {
ans += query(i << 1 | 1, mid + 1, rx, l, r);
}
return ans;
}
signed main () {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) {
cin >> a[i];
}
build(1, 1, n);
for (int i = 2; i <= M; i ++ ) {
for (int j = i; j <= M; j += i) {
t[j] ++;
}
t[i] ++;
}
while (m --) {
int op, x, y;
cin >> op >> x >> y;
if (op == 1) {
update (1, 1, n, x, y);
} else {
cout << query (1, 1, n, x, y) << "\n";
}
}
}
感激不尽!!!
回复
共 0 条回复,欢迎继续交流。
正在加载回复...