在这段AC代码的add函数中,数值修改时要加tree[k].l==tree[k].r(不然全WA)。
但是加在线段树1模板上会超时,可这两题都是区间修改。
求助大佬
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100005];
struct node
{
int l,r,num,mx;
}tree[400005];
void build(int k,int ll,int rr)
{
tree[k].l=ll;
tree[k].r=rr;
if(ll==rr){
tree[k].num=a[ll];
tree[k].mx=a[ll];
return;
}
int mid=(ll+rr)>>1;
build(k*2,ll,mid);
build(k*2+1,mid+1,rr);
tree[k].num=tree[k*2].num+tree[k*2+1].num;
tree[k].mx=max(tree[k*2].mx,tree[k*2+1].mx);
return;
}
void add(int k,int ll,int rr)
{
if(tree[k].l>=ll && tree[k].r<=rr && tree[k].l==tree[k].r){
tree[k].num=tree[k].mx=sqrt(tree[k].num);
return;
}
if(tree[k*2].r>=ll && tree[k*2].mx>1) add(k*2,ll,rr);
if(tree[k*2+1].l<=rr && tree[k*2+1].mx>1) add(k*2+1,ll,rr);
tree[k].num=tree[k*2].num+tree[k*2+1].num;
tree[k].mx=max(tree[k*2].mx,tree[k*2+1].mx);
return;
}
int ask(int k,int ll,int rr)
{
int cnt=0;
if(tree[k].l>=ll && tree[k].r<=rr){
return tree[k].num;
}
if(tree[k*2].r>=ll) cnt+=ask(k*2,ll,rr);
if(tree[k*2+1].l<=rr) cnt+=ask(k*2+1,ll,rr);
return cnt;
}
signed main()
{
int n,m;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>m;
build(1,1,n);
while(m--){
int c,x,y;
cin>>c>>x>>y;
if(x>y) swap(x,y);
if(c==0) add(1,x,y);
else cout<<ask(1,x,y)<<"\n";
}
return 0;
}