SP2713 GSS4 - Can you answer these queries IV
阿新 • • 發佈:2022-02-12
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 1e5 + 10; int n, m; int w[N]; struct Node { int l, r; int tag, sum; }tr[N * 4]; void pushup(int u) { tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum; } void build(int u, int l, int r) { if (l == r) {tr[u] = {l, r, 0, w[l]}; return;} tr[u] = {l, r}; int mid = l + r >> 1; build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r); pushup(u); } void modify(int u, int l, int r) { if (tr[u].r - tr[u].l + 1 == tr[u].sum) return; if (tr[u].l == tr[u].r) { tr[u].sum = (int)sqrt(tr[u].sum * 1.0); return; } int mid = tr[u].l + tr[u].r >> 1; if (l <= mid) modify(u << 1, l, r); if (r > mid) modify(u << 1 | 1, l, r); pushup(u); } int query(int u, int l, int r) { if (tr[u].l >= l && tr[u].r <= r) return tr[u].sum; int res = 0; int mid = tr[u].l + tr[u].r >> 1; if (l <= mid) res = query(u << 1, l, r); if (r > mid) res += query(u << 1 | 1, l, r); return res; } signed main() { int cases = 1; while (scanf("%lld", &n) != EOF) { printf("Case #%lld:\n", cases ++); for (int i = 1; i <= n; i ++ ) scanf("%lld", &w[i]); build(1, 1, n); scanf("%lld", &m); while (m -- ) { int type, l, r; scanf("%lld%lld%lld", &type, &l, &r); if (type == 0) modify(1, l, r); else { if (l > r) swap(l, r); printf("%lld\n", query(1, l, r)); } } puts(""); } return 0; }