#include<iostream>
#include<cmath>
using namespace std;
const int SQRT_N = sqrt(100000);
long long n,m,belong[100005],bg[SQRT_N + 5],ed[SQRT_N + 5];
long long sum[SQRT_N + 5],a[100005];
inline void modify_sqrt(int l,int r){
if(belong[l] == belong[r])
{
for(int i = l;i <= r;i += 1)
{
sum[belong[r]] -= a[i];
a[i] = sqrt(a[i]);
sum[belong[r]] += a[i];
}
}
else
{
for(int i = belong[l] + 1;i <= belong[r] - 1;i += 1)
{
if(sum[i] == ed[i] - bg[i] + 1)
{
continue;
}
else
{
sum[i] = 0;
for(int j = bg[i];j <= ed[i];j += 1)
{
a[j] = sqrt(a[j]);
sum[i] += a[j];
}
}
}
for(int i = l;i <= ed[belong[l]];i += 1)
{
sum[belong[i]] -= a[i];
a[i] = sqrt(a[i]);
sum[belong[i]] += a[i];
}
for(int i = bg[belong[r]];i <= r;i += 1)
{
sum[belong[i]] -= a[i];
a[i] = sqrt(a[i]);
sum[belong[i]] += a[i];
}
}
return;
}
inline int query_sum(int l,int r){
long long res = 0;
if(belong[l] == belong[r])
{
for(int i = l;i <= r;i += 1)
{
res += a[i];
}
return res;
}
else
{
for(int i = l;i <= ed[belong[l]];i += 1)
{
res += a[i];
}
for(int i = belong[l] + 1;i <= belong[r] - 1;i += 1)
{
res += sum[i];
}
for(int i = bg[belong[r]];i <= r;i += 1)
{
res += a[i];
}
return res;
}
return 0;
}
int main(){
//freopen("a1.in","r",stdin);
//freopen("a1.ans","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
m = sqrt(n);
for(int i = 1;i <= n;i += 1)
{
cin>>a[i];
}
for(int i = 1;i <= m;i += 1)
{
bg[i] = n / m * (i - 1) + 1;
ed[i] = (i != m ? n / m * i : n);
for(int j = bg[i];j <= ed[i];j += 1)
{
belong[j] = i;
sum[i] += a[j];
}
}
int opt,l,r,q;
cin>>q;
for(int i = 1;i <= q;i += 1)
{
cin>>opt>>l>>r;
if(l > r)
{
swap(l,r);
}
if(opt == 0)
{
modify_sqrt(l,r);
}
else if(opt == 1)
{
cout<<query_sum(l,r)<<'\n';
}
}
return 0;
}
这个代码 LOJ 的测试改改输入输出可以过,但是丢过来用不了,long long 开了,l≥r 也处理了。实在不知道错哪了,求神犇调调 QAQ