1 条题解
-
0
#include <bits/stdc++.h> #define int long long using namespace std; const int MAXN = 500000 + 5; int n, m; int a[MAXN]; //线段树 bool flag[MAXN << 2]; int t[MAXN << 2]; void up(int now) { t[now] = t[now * 2] + t[now * 2 + 1]; flag[now] = flag[now * 2] && flag[now * 2 + 1]; } void build(int now, int l, int r) { if (l == r) { t[now] = a[l]; flag[now] = t[now] == 1 || t[now] == 0; return; } int mid = (l + r) / 2; build(now * 2, l, mid); build(now * 2 + 1, mid + 1, r); up(now); } void update(int now, int l, int r, int x, int y) { if (flag[now]) return; if (l == r) { t[now] = sqrt(t[now]); flag[now] = t[now] == 1 || t[now] == 0; return; } int mid = (l + r) / 2; if (x <= mid) update(now * 2, l, mid, x, y); if (y > mid) update(now * 2 + 1, mid + 1, r, x, y); up(now); } int query(int now, int l, int r, int x, int y) { if (x <= l && r <= y) return t[now]; int res = 0; int mid = (l + r) / 2; if (x <= mid) res += query(now * 2, l, mid, x, y); if (y > mid) res += query(now * 2 + 1, mid + 1, r, x, y); return res; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; build(1, 1, n); cin >> m; while (m--) { int op, l, r; cin >> op >> l >> r; if (l > r) swap(l, r); if (op == 0) update(1, 1, n, l, r); else cout << query(1, 1, n, l, r) << "\n"; } return 0; }
- 1
信息
- ID
- 4849
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 21
- 已通过
- 12
- 上传者