样例没过求助
查看原帖
样例没过求助
550957
Anonymely楼主2022/7/9 09:52
#include<bits/stdc++.h>
using namespace std;
//#define int long long

#define lson(p) (p<<1)
#define rson(p) ((p<<1)|1)
#define md(l,r) ((l+r)>>1)

const int N=200005;

int n,m;
int a[N];

struct tree{
	int l,r;
	int sum;
	int maxn;
}t[4*N];

void pushup(int p){
	t[p].sum=t[lson(p)].sum+t[rson(p)].sum;
	t[p].maxn=max(t[lson(p)].maxn,t[rson(p)].maxn);
}

void build(int p,int l,int r){
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].sum=t[p].maxn=a[l];
		return ;
	}
	int mid=md(l,r);
	build(lson(p),l,mid);
	build(rson(p),mid+1,r);
	pushup(p);
}

void add(int p,int l,int r){
	if(t[p].l==t[p].r){
		t[p].sum=(int)(sqrt(t[p].sum));
		t[p].maxn=(int)(sqrt(t[p].maxn));
		return ;
	} 
	int mid=(t[p].l,t[p].r);
	if(l<=mid&&t[lson(p)].maxn>1)add(lson(p),l,r);
	if(mid<r&&t[rson(p)].maxn>1)add(rson(p),l,r);
	pushup(p);
} 

int query(int p,int l,int r){
	if(l<=t[p].l&&t[p].r<=r)return t[p].sum;
	int mid=md(t[p].l,t[p].r);
	int ans=0;
	if(l<=mid)ans+=query(lson(p),l,r);
	if(r>mid)ans+=query(rson(p),l,r);
	return ans;
}

signed main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);

	cin>>m;
	while(m--){
		int op,l,r;cin>>op>>l>>r;
		if(l>r)swap(l,r);
		if(op==0){
			add(1,l,r); 
		}else{
			cout<<query(1,l,r)<<endl;
		}
		for(int i=1;i<=n;i++)cout<<query(1,i,i)<<' ';
		cout<<endl;
	}
	return 0;
}

rt,应该是add函数锅了,但是调不出来qwq

2022/7/9 09:52
加载中...