MnZnTLE50pts求助
查看原帖
MnZnTLE50pts求助
590925
_x_y_楼主2023/8/4 20:32
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 1e5 + 10;
int n, aa[N], m;
inline long long read(){
	register long long sum = 0, zf = 1;
	register char ch;
	ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-')
			zf = -1;
		ch = getchar();
	}
	while('0' <= ch && ch <= '9'){
		sum = sum * 10 + ch - '0';
		ch = getchar();
	}
	return sum * zf;
}
struct node{
	int l, r;
	long long sum;
}a[N * 4];
void build(int l, int r, int p){
	a[p].l = l;
	a[p].r = r;
	if(l == r){
		a[p].sum = aa[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(l, mid, p * 2);
	build(mid + 1, r, p * 2 + 1);
	a[p].sum = a[p * 2].sum + a[p * 2 + 1].sum;
}
long long ask(int l, int r, int p){
	if(l <= a[p].l && a[p].r <= r)
		return a[p].sum;
	int mid = (a[p].l + a[p].r) >> 1;
	long long ans = 0;
	if(l <= mid)
		ans += ask(l, r, p * 2);
	if(r > mid)
		ans += ask(l, r, p * 2 + 1);
	return ans;
}
void change(int x, int p){
	if(a[p].l == a[p].r){
		a[p].sum = sqrt(a[p].sum);
		aa[a[p].l] = sqrt(aa[a[p].l]);
		return;
	}
	int mid = (a[p].l + a[p].r) >> 1;
	if(x <= mid)
		change(x, p * 2);
	else
		change(x, p * 2 + 1);
	a[p].sum = a[p * 2].sum + a[p * 2 + 1].sum;
}
int main(){
	n = read();
	for(int i = 1; i <= n; i++)
		aa[i] = read();
	build(1, n, 1);
	m = read();
	while(m--){
		int x, l, r;
		x = read();
		l = read();
		r = read();
		if(l > r)
			swap(l, r);
		if(x == 1)
			printf("%lld\n", ask(l, r, 1));
		else{
			for(int i = l; i <= r; i++)
				if(aa[i] != 1 && aa[i] != 0)
					change(i, 1);
		}
	}
	return 0;
}
2023/8/4 20:32
加载中...