全WA求调,悬赏1关
查看原帖
全WA求调,悬赏1关
1201743
QinYulang楼主2024/8/14 21:05
#include <algorithm>
#include <iostream>
#include <cmath>
#include <set>
#include <bitset>
#include <map>
#include <vector>
#include <list>
#include <queue>
#include <deque>
#include <array>
#include <bits/stl_pair.h>

class Node{
	public:
		int val, size;
		int l, r;
};
Node tree[400005];
int w[100005];

void pushup(int k){
	tree[k].val = tree[k << 1].val + tree[k << 1 | 1].val;
}
void build(int k, int l, int r){
	tree[k].l = l, tree[k].r = r;
	tree[k].size = r - l + 1;
	if(l == r){
		tree[k].val = w[l];
		return ;
	}
	int mid = l + r >> 1;
	build(k << 1, l, mid);
	build(k << 1 | 1, mid + 1, r);
	pushup(k);
	return ;
}
void modify(int k, int l, int r){
	if(tree[k].val == tree[k].size) return ;
	if(tree[k].l == tree[k].r){
		tree[k].val = sqrt(tree[k].val);
		return ;
	}
	int mid = tree[k].l + tree[k].r >> 1;
	if(l <= mid) modify(k << 1, l, mid);
	if(mid < r) modify(k << 1 | 1, mid + 1, r);
	pushup(k);
	return ;
}
int query(int k, int l, int r){
	if(l <= tree[k].l && tree[k].r <= r) return tree[k].val;
	int mid = tree[k].l + tree[k].r >> 1, ans = 0;
	if(l <= mid) ans += query(k << 1, l, r);
	if(mid < r) ans += query(k << 1 | 1, l, r);
	return ans;
}

int main(){
	int n;
	std::cin >> n;
	for(int i = 1; i <= n; ++i) std::cin >> w[i];
	build(1, 1, n);
	int q;
	std::cin >> q;
	while(q--){
		int opt, l, r;
		std::cin >> opt >> l >> r;
		if(l > r) l ^= r ^= l ^= r;
		if(opt == 0) modify(1, l, r);
		else std::cout << query(1, l, r) << '\n';
	}
	return 0;
}
2024/8/14 21:05
加载中...