社区讨论

50pts求调

P4145上帝造题的七分钟 2 / 花神游历各国参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lrkqbgpw
此快照首次捕获于
2024/01/19 22:21
2 年前
此快照最后确认于
2024/01/20 10:15
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int maxn=5e6+5;
inline int lt(int x){return x*2;}
inline int rt(int x){return x*2+1;}
int n,m;
ll a[maxn];
struct Node{
	int l,r;
	ll dat;
}tre[8*maxn];
void build(int x,int l,int r){
	tre[x].l=l;
	tre[x].r=r;
	if(l==r){
		tre[x].dat=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(lt(x),l,mid);
	build(rt(x),mid+1,r);
	tre[x].dat=tre[lt(x)].dat+tre[rt(x)].dat;
}
void change(int x,int l,int r){
	if(r<tre[x].l||tre[x].r<l) return;
	if(tre[x].l==tre[x].r){
		tre[x].dat=sqrt(tre[x].dat);
		return;
	}
	if(tre[lt(x)].r-tre[lt(x)].l+1!=tre[lt(x)].dat) change(lt(x),l,r);
	if(tre[rt(x)].r-tre[rt(x)].l+1!=tre[rt(x)].dat) change(rt(x),l,r);
	tre[x].dat=tre[lt(x)].dat+tre[rt(x)].dat;
}
ll ask(int x,int l,int r){	
	if(r<tre[x].l||tre[x].r<l) return 0;
	if(l<=tre[x].l&&tre[x].r<=r){
		return tre[x].dat;
	}
	tre[x].dat=tre[lt(x)].dat+tre[rt(x)].dat;
	return ask(lt(x),l,r)+ask(rt(x),l,r);
}
ll Read(){
	ll Re=0;
	char c=getchar(); 
	while(c<'0'||'9'<c) c=getchar();
	while('0'<=c&&c<='9') Re=Re*10+c-'0',c=getchar();
	return Re;
}
int main(){
//	freopen("P4145_7.in","r",stdin);
//	freopen("P4145.ans","w",stdout);
	cin >> n;
	for(int i=1;i<=n;i++) a[i]=Read();
	build(1,1,n);
	cin >> m;
	while(m--){
		ll op,l,r,k;
		cin >> op >> l >> r;
		if(op==0){
			change(1,l,r);
		}else{
			if(r<l) swap(l,r);
			cout << ask(1,l,r) << endl;
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...