#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <algorithm>
typedef long long ll;
using namespace std;
long long Sum[300000];
long long A[300000];
void PushUp(long long rt)
{
Sum[rt]=Sum[rt*2]+Sum[rt*2+1];
A[rt]=A[rt*2]&&A[rt*2+1];
}
void Build(long long l,long long r,long long rt)
{
if(l==r)
{
scanf("%d",&Sum[rt]);
if(Sum[rt]<=1)
A[rt]=1;
return;
}
long long m=(l+r)/2;
Build(l,m,rt*2);
Build(m+1,r,rt*2+1);
PushUp(rt);
}
void Update(int x,int y,int l,int r,int rt)
{
if(A[rt]==1)
return;
if(l==r)
{
Sum[rt]=sqrt(Sum[rt]);
if(Sum[rt]<=1)
A[rt]=1;
return;
}
int m=(l+r)/2;
if(x<=m)
Update(x,y,l,m,rt*2);
if(y>m)
Update(x,y,m+1,r,rt*2+1);
PushUp(rt);
}
long long Query(long long x,long long y,long long l,long long r,long long rt)
{
if(x<=l && r<=y)
return Sum[rt];
long long m=(l+r)/2;
long long num=0;
if(x<=m)
num+=Query(x,y,l,m,rt*2);
if(y>m)
num+=Query(x,y,m+1,r,rt*2+1);
return num;
}
int main()
{
long long n,m;
scanf("%lld",&n);
Build(1,n,1);
scanf("%lld",&m);
long long a,b,c;
while(m--)
{
scanf("%lld%lld%lld",&a,&b,&c);
if(a==1)
printf("%lld\n",Query(b,c,1,n,1));
else if(a==2)
Update(b,c,1,n,1);
}
return 0;
}
花神游历各国(线段树 区间开方)注释:floor 向下取整
最新推荐文章于 2021-11-09 20:37:25 发布