求条!无法通过样例(悲
查看原帖
求条!无法通过样例(悲
909957
LITFLYR楼主2024/7/27 16:21
#include<bits/stdc++.h>
using namespace std;
//#define int short //Sharpsmile的几餐记录 
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
int n,a[100005],m,k,x,y;
struct tr{
	int mmax;
	int size;
}tre[400005];
void push_up(int f){
	tre[f].size=tre[ls(f)].size+tre[rs(f)].size;
	tre[f].mmax=max(tre[ls(f)].mmax,tre[rs(f)].mmax);
}
void build(int f,int l,int r){
	if(l==r){
		tre[f].size=a[l];
		tre[f].mmax=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(ls(f),l,mid);
	build(rs(f),mid+1,r);
	push_up(f);
}
void sqr(int f,int l,int r,int x,int y){
	if(l>=x&&r<=y&&l==r){
		tre[f].size=sqrt(tre[f].size);
		tre[f].mmax=tre[f].size;
		return ;
	}
	int mid=(l+r)>>1;
	if(mid>=x&&tre[ls(f)].mmax>1) sqr(ls(f),l,mid,x,y);
	if(y<mid&&tre[rs(f)].mmax>1) sqr(rs(f),mid+1,r,x,y);
	push_up(f);
}
int query(int f,int l,int r,int x,int y){
	if(x<=l&&y>=r){
		return tre[f].size;
	}
	int mid=(l+r)>>1;int ans=0;
	if(mid>=x) ans+=query(ls(f),l,mid,x,y);
	if(y>mid) ans+=query(rs(f),mid+1,r,x,y);
	return ans;
}
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++){
		cin >> k >> x >> y;
		if(x>y) swap(x,y);
		if(k==0){
			sqr(1,1,n,x,y);
		}
		else{
			cout << query(1,1,n,x,y) << endl;
		}
	}
	return 0;
}
2024/7/27 16:21
加载中...