样例不过求调
查看原帖
样例不过求调
999274
CNS_5t0_0r2楼主2024/1/22 18:13
#include<bits/stdc++.h>
#define lchild (root << 1)
#define rchild ((root << 1) + 1)
#define mid ((l + r) >> 1)
using namespace std;
typedef long long ll;
const int N = 1e5 + 9;
int n,m;
ll a[N];
struct node{
	ll sum,Max;
} t[N << 2];
bool in_range(int l,int r,int L,int R){
	return L <= l && r <= R;
}
bool out_range(int l,int r,int L,int R){
	return L > r || l > R;
}
void push_up(int root){
	t[root].sum = t[lchild].sum + t[rchild].sum;
	t[root].Max = max(t[lchild].Max,t[rchild].Max);
}
void build(int root,int l,int r){
	if(l == r){
		t[root].sum = t[root].Max = a[l];
		return;
	}
	build(lchild,l,mid);
	build(rchild,mid + 1,r);
	push_up(root);
}
void update(int root,int l,int r,int L,int R){
	if(t[root].Max == 1)
		return;
	if(l == r){
		t[root].sum = t[root].Max = (ll)sqrt(t[root].sum);
		return;
	}
	if(!out_range(l,r,L,R)){
		update(lchild,l,mid,L,R);
		update(rchild,mid + 1,r,L,R);
	}
	push_up(root);
}
ll query(int root,int l,int r,int L,int R){
	if(in_range(l,r,L,R))
		return t[root].sum;
	if(!out_range(l,r,L,R))
		return query(lchild,l,mid,L,R) + query(rchild,mid + 1,r,L,R);
	return 0;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n;
	for(int i = 1;i <= n;i++)
		cin >> a[i];
	build(1,1,n);
	cin >> m;
	for(int i = 1;i <= m;i++){
		int k,l,r;
		cin >> k >> l >> r;
		if(l > r)
			swap(l,r);
		if(k == 0)
			update(1,1,n,l,r);
		else
			cout << query(1,1,n,l,r) << '\n';
	}
	return 0;
}
2024/1/22 18:13
加载中...