线段树数据不开到1e6+5乘4可能会到边界,如:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int tree[N*4],a[N],maxx[N];
int n,m;
void pushup(int rt){
maxx[rt]=max(maxx[rt<<1],maxx[rt<<1|1]);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
void build(int l,int r,int rt){
if(l==r){
tree[rt]=maxx[rt]=a[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
}
void update(int l,int r,int rt,int L,int R){
if(l==r&&l>=L&&r<=R){
tree[rt]=maxx[rt]=sqrt(tree[rt]);
return;
}
int mid=(l+r)>>1;
if(L<=mid&&maxx[rt<<1]>1) update(l,mid,rt<<1,L,R);
if(mid<R&&maxx[rt<<1|1]>1) update(mid+1,r,rt<<1|1,L,R);
pushup(rt);
}
int query(int l,int r,int rt,int L,int R){
if(L<=l&&r<=R){
return tree[rt];
}
int sum=0;
int mid=(l+r)>>1;
if(L<=mid)sum+=query(l,mid,rt<<1,L,R);
if(R>mid)sum+=query(mid+1,r,rt<<1|1,L,R);
return sum;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
cin>>m;
while(m--){
int pos,x,y;
cin>>pos>>x>>y;
if(x>y){
swap(x,y);
}
if(pos==0){
update(1,n,1,x,y);
}
if(pos==1){
cout<<query(1,n,1,x,y)<<endl;
}
}
return 0;
}
就会50pts 但把
const int N=1e5+10;
改成
const int N=1e6+10
就能过
为啥啊