萌新五十分求助。。。
查看原帖
萌新五十分求助。。。
661384
sdfsl楼主2022/12/4 14:13

后面五个点全wa; 开了 long long; 调了一下午也不知道错在哪里了QAQ;

#include<bits/stdc++.h>
using namespace std;
struct tree{
	int l;
	int r;
	long long tot;
	long long maxn;
}t[4000005];
int n,m;
long long a[1000005];
void build(int p,int l,int r)
{
	t[p].l=l;
	t[p].r=r;
	if(l==r){
		t[p].tot=a[l];
		t[p].maxn=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].tot=t[p*2].tot+t[p*2+1].tot;
	t[p].maxn=max(t[p*2].maxn,t[p*2+1].maxn);
}
void change(int p,int l,int r,int x,int y)
{
	if(l==r)
	{
		t[p].tot=sqrt(t[p].tot);
		t[p].maxn=sqrt(t[p].maxn);
		return;
	}
	int mid=(l+r)/2;
	if(x<=mid&&t[p*2].maxn>1) change(p*2,l,mid,x,y);
	if(mid<y&&t[p*2+1].maxn>1) change(p*2+1,mid+1,r,x,y);
	t[p].maxn=max(t[p*2].maxn,t[p*2+1].maxn);
	t[p].tot=t[p*2].tot+t[p*2+1].tot;
}
long long ask(int p,int l,int r,int x,int y)
{
	if(x<=l&&y>=r) return t[p].tot;
	int mid=(l+r)/2;
	long long ans=0;
	if(x<=mid) ans+=ask(p*2,l,mid,x,y);
	if(mid<y) ans+=ask(p*2+1,mid+1,r,x,y); 
	return ans;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		int k,l,r;
        if(l>r)
        {
            int swap=l;
            l=r;
            r=swap;
        }
		scanf("%d%d%d",&k,&l,&r);
		if(k==1){
			printf("%lld\n",ask(1,1,n,l,r));
		}
		else if(k==0){
			change(1,1,n,l,r);
		}
	}
} 
2022/12/4 14:13
加载中...