比赛 |
树形数据结构拔高 |
评测结果 |
AAAAAAAAAA |
题目名称 |
HS造题的七分钟 |
最终得分 |
100 |
用户昵称 |
LikableP |
运行时间 |
0.804 s |
代码语言 |
C++ |
内存使用 |
5.25 MiB |
提交时间 |
2025-04-17 20:17:16 |
显示代码纯文本
#include <cstdio>
#include <cmath>
#define ls(root) root << 1
#define rs(root) root << 1 | 1
typedef long long ll;
template <typename T>
T max(T x, T y) {
return x > y ? x : y;
}
template <typename T>
void swap(T &x, T &y) {
x ^= y ^= x ^= y;
}
const int MAXN = 1e5 + 10;
struct NODE {
ll maxx, sum;
} node[MAXN << 2];
int n, m;
ll a[MAXN];
void Merge(int root) {
node[root].sum = node[ls(root)].sum + node[rs(root)].sum;
node[root].maxx = max(node[ls(root)].maxx, node[rs(root)].maxx);
}
void Build(int root, int lt, int rt) {
if (lt == rt) {
node[root].maxx = node[root].sum = a[lt];
return ;
}
int mid = lt + ((rt - lt) >> 1);
Build(ls(root), lt, mid);
Build(rs(root), mid + 1, rt);
Merge(root);
}
void SqrtSeq(int root, int lt, int rt, int lq, int rq) {
if (lt == lq && rt == rq) {
if (node[root].maxx == 1) return ;
if (lt == rt) {
node[root].sum = sqrt(node[root].sum);
node[root].maxx = node[root].sum;
return ;
}
}
int mid = lt + ((rt - lt) >> 1);
if (rq <= mid) {
SqrtSeq(ls(root), lt, mid, lq, rq);
} else if (lq > mid) {
SqrtSeq(rs(root), mid + 1, rt, lq, rq);
} else {
SqrtSeq(ls(root), lt, mid, lq, mid);
SqrtSeq(rs(root), mid + 1, rt, mid + 1, rq);
}
Merge(root);
}
ll GetSeq(int root, int lt, int rt, int lq, int rq) {
if (lt == lq && rt == rq) {
return node[root].sum;
}
int mid = lt + ((rt - lt) >> 1);
if (rq <= mid) {
return GetSeq(ls(root), lt, mid, lq, rq);
} else if (lq > mid) {
return GetSeq(rs(root), mid + 1, rt, lq, rq);
} else {
return GetSeq(ls(root), lt, mid, lq, mid) + GetSeq(rs(root), mid + 1, rt, mid + 1, rq);
}
}
int main() {
freopen("hssqrt.in", "r", stdin);
freopen("hssqrt.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%lld", &a[i]);
}
Build(1, 1, n);
scanf("%d", &m);
while (m--) {
int k, l, r;
scanf("%d %d %d", &k, &l, &r);
if (l > r) swap(l ,r);
if (k == 0) {
SqrtSeq(1, 1, n, l, r);
} else {
printf("%lld\n", GetSeq(1, 1, n, l, r));
}
}
return 0;
}