题意是给你一段数组,区间修改该数的平方根,求区间和。
有三个点需要注意:
1.题意说了四舍五入,但是解题不需要
2.区间可能给的是从大到小(0 10 1)
3.数据范围很大,用long long存储
另外注意一下格式
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
#define int long long
const int MAX_N=200010;
int s[4*MAX_N];
void up(int p){
s[p]=s[p*2]+s[p*2+1];
}
void modify(int p,int l,int r,int x,int v){
if(l==r){
s[p]=v;
return;
}
int mid=(l+r)/2;
if(x<=mid){
modify(p*2,l,mid,x,v);
}
else{
modify(p*2+1,mid+1,r,x,v);
}
up(p);
}
int query(int p,int l,int r,int x,int y){
if(x<=l&&r<=y){
return s[p];
}
int mid=(l+r)/2,res=0;
if(x<=mid){
res+=query(p*2,l,mid,x,y);
}
if(y>mid){
res+=query(p*2+1,mid+1,r,x,y);
}
return res;
}
void update(int p,int l,int r,int x,int y){
if(s[p]==r-l+1)return;
if(l==r){
s[p]=sqrt(s[p]);
return;
}
int mid=(l+r)/2;
if(x<=mid){
update(p*2,l,mid,x,y);
}
if(y>mid){
update(p*2+1,mid+1,r,x,y);
}
up(p);
}
signed main(){
int n;
int flag=1;
while(~scanf("%lld",&n)){
for(int i=1;i<=n;i++){
int d;
scanf("%lld",&d);
modify(1,1,n,i,d);
}
int q;
scanf("%lld",&q);
printf("Case #%lld:\n",flag++);
while(q--){
int d,x,y;
scanf("%lld%lld%lld",&d,&x,&y);
if(x>y)swap(x,y);
if(d==0){
update(1,1,n,x,y);
}
else{
cout<<query(1,1,n,x,y)<<endl;
}
}
printf("\n");
}
return 0;
}