蒟蒻WA求助!!!!
查看原帖
蒟蒻WA求助!!!!
669752
ZnHF楼主2023/9/18 21:03
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long a[100005];
struct node{
	int l,r;
	long long mx,sum;
	#define l(x) t[x].l
	#define r(x) t[x].r
	#define mx(x) t[x].mx
	#define sum(x) t[x].sum 
}t[100005*4];
inline void build(int p,int l,int r){
	l(p)=l;
	r(p)=r;
	if(l==r){
		sum(p)=a[l];
		mx(p)=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	sum(p)=sum(p*2)+sum(p*2+1);
	mx(p)=max(mx(p*2),mx(p*2+1));
}
inline void change(int p,int l,int r){
	if(l(p)==r(p)){
		sum(p)=sqrt(sum(p));
		mx(p)=sqrt(mx(p));
		return;
	}
	int mid=(l(p)+r(p))/2;
	if(l<=mid && mx(p*2)>1) change(p*2,l,r);
	if(r>mid && mx(p*2+1)>1) change(p*2+1,l,r);
	sum(p)=sum(p*2)+sum(p*2+1);
	mx(p)=max(mx(p*2),mx(p*2+1));
}
inline long long ask(int p,int l,int r){
	if(l<=l(p) && r>=r(p)) return sum(p);
	int mid=(l(p)+r(p))/2;
	long long v=0;
	if(l<=mid) v+=ask(p*2,l,r);
	if(r>mid) v+=ask(p*2+1,l,r);
	return v;
}
inline int read() {
	register int x = 0, f = 0;
	register char c = getchar();
	while (c < '0' || c > '9') { if (c == '-') f |= 1; c = getchar(); }
	while (c >= '0' && c <= '9') { x = (x<<3)+(x<<1)+(c^48); c = getchar(); }
	return f ? -x : x;
}
int main(){
	register int c=1;
	freopen("1.txt","w",stdout);
	while(~scanf("%d",&n)){
		cout<<"Case #"<<c<<":"<<endl;
		c++;
		memset(a,0,sizeof(a));
		memset(t,0,sizeof(t));
		for(int i=1;i<=n;i++) a[i]=read();
		build(1,1,n);
		m=read();
		while(m--){
			int t1=read(),t2=read(),t3=read();
			if(t2>t3) swap(t2,t3);
			if(t1==0){
				change(1,t2,t3);
			}
			else{
				printf("%lld\n",ask(1,t2,t3));
			}
		}
		printf("\n");
	}
	return 0;
}

记录

2023/9/18 21:03
加载中...