程序已停止工作
查看原帖
程序已停止工作
190931
cannotdp楼主2023/1/28 09:55

RT

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int n,m;
struct ST{
	int l,r;
	ll maxn,dat;
}t[N*4];
ll a[N];
void build(int p,int l,int r){
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].maxn=t[p].dat=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].dat=t[p*2].dat+t[p*2+1].dat;
	t[p].maxn=max(t[p*2].maxn,t[p*2+1].maxn);
}
void change(int p,int l,int r){
	if(t[p].maxn==1) return;
	if(t[p].l==t[p].r){
		t[p].dat=t[p].maxn=sqrt(t[p].dat);
		return;
	}
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid) change(p*2,l,r);
	if(r>mid) change(p*2+1,l,r);
	t[p].dat=t[p*2].dat+t[p*2+1].dat;
	t[p].maxn=max(t[p*2].maxn,t[p*2+1].maxn);
}
ll ask(int p,int l,int r){
	if(l<=t[p].l&&r>=t[p].r) return t[p].dat;
	int mid=(t[p].l+t[p].r)>>1;
	ll val=0;
	if(l<=mid) val+=ask(p*2,l,r);
	if(r>mid) val+=ask(p*2+1,l,r);
	return val;
}
signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		int k,l,r;
		scanf("%d%d%d",&k,&l,&r);
		if(l>r) swap(l,r);
		if(!k){
			change(1,l,r);
		}
		else printf("%lld\n",ask(1,l,r));
	}
	return 0;
}

输入样例,在第一个询问时,会弹出

请问这是为什么

2023/1/28 09:55
加载中...