50分,wa7,8,9,10,11,求调
查看原帖
50分,wa7,8,9,10,11,求调
757101
junee楼主2023/11/17 08:47
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int n,m;
int a[N];
struct node{
	long long l,r,sum;
	long long maxn;
}tr[N*4];
void pushup(int u){
	tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
	tr[u].maxn=max(tr[u<<1].maxn,tr[u<<1|1].maxn);
}
void build(int u,int l,int r){
	tr[u]={l,r};
	if(l==r){
		tr[u].maxn=tr[u].sum=a[l];
		return;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void modify(int u,int l,int r){
	if(tr[u].l==tr[u].r){
		tr[u].sum=sqrt(tr[u].sum);
		tr[u].maxn=sqrt(tr[u].maxn);
		return;
	}
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid&&tr[u<<1].maxn>1)modify(u<<1,l,r);
	if(r>mid&&tr[u<<1|1].maxn>1)modify(u<<1|1,l,r);
	pushup(u);
}
long long query(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r){
		return tr[u].sum;
	}
	int mid=(tr[u].r+tr[u].l)>>1;
	long long v=0;
	if(l<=mid)v+=query(u<<1,l,r);
	if(r>mid)v+=query(u<<1|1,l,r);
	return v;
}
int main(){
	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 op,l,r;
		cin>>op>>l>>r;
		if(l>r)swap(l,r);
		if(op==0)modify(1,l,r);
		if(op==1)cout<<query(1,l,r)<<endl;
	}
	return 0;
}
2023/11/17 08:47
加载中...