libreoj10128
题解:暴力修改,当递归到区间最大值<=1时,就return;
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn=1e5+10;
LL a[maxn],tree[maxn<<2],mx[maxn<<2];
LL n,m;
void build(LL l,LL r,LL rt)
{
if(l==r){
//scanf("%lld",&a[l]);
tree[rt]=mx[rt]=a[l];
return;
}
LL mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
}
void update(LL l,LL r,LL rt,LL x,LL y)
{
if(l==r){
tree[rt]=sqrt(tree[rt]);
mx[rt]=sqrt(mx[rt]);
return;
}
if(mx[rt]<=1){
return;
}
LL mid=(l+r)>>1;
if(x<=mid){
update(l,mid,rt<<1,x,y);
}
if(y>mid){
update(mid+1,r,rt<<1|1,x,y);
}
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
}
LL query(LL l,LL r,LL rt,LL x,LL y)
{
if(l>=x&&r<=y){
return tree[rt];
}
LL mid=(l+r)>>1;
LL sum=0;
if(x<=mid){
sum+=query(l,mid,rt<<1,x,y);
}
if(y>mid){
sum+=query(mid+1,r,rt<<1|1,x,y);
}
return sum;
}
int main()
{
scanf("%lld",&n);
for(LL i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,n,1);
scanf("%lld",&m);
LL op,x,y;
while(m--){
scanf("%lld%lld%lld",&op,&x,&y);
if(op==1){
printf("%lld\n",query(1,n,1,x,y));
}
else{
update(1,n,1,x,y);
}
}
return 0;
}