比赛 树形数据结构拔高 评测结果 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;
}