蒟蒻求调!线段树(?)T了三个点#7,10,11
查看原帖
蒟蒻求调!线段树(?)T了三个点#7,10,11
693228
hyjdouSHEN楼主2024/8/14 08:15
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define int long long
const int N=1e5+10;
int n,m,a[N];
struct node{
	int l,r,sum,maxx;
}tree[N*4];
inline int read(){
	register int w=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9'){
		w=(w<<3)+(w<<1)+ch-'0';
		ch=getchar();
	}
	return w;
}
inline int ll(int x){
	return x*2;
}
inline int rr(int x){
	return x*2+1;
}
inline void push_up(node &x,node &l,node &r){
	x.l=l.l;
	x.r=r.r;
	x.sum=l.sum+r.sum;
	x.maxx=max(l.maxx,r.maxx);
}
inline void push_up(int x){
	push_up(tree[x],tree[ll(x)],tree[rr(x)]);
}
inline void build(int x,int l,int r){
	if(l==r){
		tree[x]={l,l,a[l],a[l]};
		return;
	}
	int mid=l+r>>1;
	build(ll(x),l,mid);
	build(rr(x),mid+1,r);
	push_up(x);
}
inline int querymax(int x,int l,int r){	
	if(tree[x].l>=l&&tree[x].r<=r) return tree[x].maxx;
	int res=0;
	int mid=(tree[x].l+tree[x].r)>>1;
	if(l<=mid) res=max(res,querymax(ll(x),l,r));
	if(r>mid) res=max(res,querymax(rr(x),l,r));
	return res;
}
inline void update(int x,int l,int r){
	if(querymax(1,l,r)==1) return ;
	if(tree[x].l==tree[x].r&&tree[x].l>=l&&tree[x].r<=r){
		tree[x].sum=sqrt(tree[x].sum);
		tree[x].maxx=sqrt(tree[x].maxx);
		return ;
	}
	int mid=(tree[x].l+tree[x].r)>>1;
	if(l<=mid) update(ll(x),l,r);
	if(r>mid) update(rr(x),l,r);
	push_up(x);
}
inline int query(int x,int l,int r){	
	if(tree[x].l>=l&&tree[x].r<=r) return tree[x].sum;
	int res=0;
	int mid=(tree[x].l+tree[x].r)>>1;
	if(l<=mid) res+=query(ll(x),l,r);
	if(r>mid) res+=query(rr(x),l,r);
	return res;
}
signed main()
{
	cin>>n;
	for(register int i=1;i<=n;++i){
		a[i]=read();
	}
	cin>>m;
	build(1,1,n);
	while(m--){
//		for(int i=1;i<=25;i++) cout<<tree[i].l<<" "<<tree[i].r<<" "<<tree[i].maxx<<" "<<tree[i].sum<<endl;
//		cout<<endl;
		int op,l,r;
		op=read();
		l=read();
		r=read();
		if(l>r) swap(l,r);
		if(op==0){
			update(1,l,r);
		}
		if(op==1){
			printf("%lld\n",query(1,l,r));
		}
	}
	return 0;
}
2024/8/14 08:15
加载中...