链接:点击打开链接
题意:对于区间中每个数开平方,求给出区间的区间和
代码:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int siz=100005;
long long tree[siz<<2];
void build(int l,int r,int rt){
if(l==r){
scanf("%I64d",&tree[rt]);
return;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
void Change(int L,int R,int l,int r,int rt){
if(tree[rt]==r-l+1)
return;
if(l==r){
tree[rt]=sqrt(tree[rt]);
return;
}
int m=(l+r)>>1;
if(L<=m)
Change(L,R,l,m,rt<<1);
if(R>m)
Change(L,R,m+1,r,rt<<1|1);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
long long query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R)
return tree[rt];
int m=(l+r)>>1;
long long ans=0;
if(L<=m)
ans+=query(L,R,l,m,rt<<1);
if(R>m)
ans+=query(L,R,m+1,r,rt<<1|1);
return ans;
}凯
int main(){ //因为对于每一个数来说,最后肯定
int n,m,i,j,u,v,op,cas=1; //不会开几次方就变成了1,所以直接
while(scanf("%d",&n)!=EOF){ //暴力更新叶子节点
build(1,n,1);
scanf("%d",&m);
printf("Case #%d:\n",cas++);
while(m--){
scanf("%d%d%d",&op,&u,&v);
if(u>v) //有可能u>v
swap(u,v);
if(op==0)
Change(u,v,1,n,1);
else
printf("%I64d\n",query(u,v,1,n,1));
}
printf("\n");
}
return 0;
}