板块漂移轻喷
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5, sN = 1e3;
int n, T, a[N], sum[sN], mark[sN], id[N];
void dost(int i)
{
int ti = sqrt(a[i]);
sum[id[i]] -= (a[i] - ti);
if (a[i] > 1 && ti <= 1) mark[id[i]] --;
a[i] = ti;
}
signed main()
{
scanf("%lld", &n);
for (int i = 1; i <= n; i ++)
{
scanf("%lld", &a[i]);
id[i] = i / sqrt(n) + 1;
sum[id[i]] += a[i];
mark[id[i]] += (a[i] > 1);
}
scanf("%lld", &T);
while (T --)
{
int op, l, r;
scanf("%lld %lld %lld", &op, &l, &r);
if (l > r) swap(l, r);
if (op == 0)
{
int sid = id[l], eid = id[r], cnt = l;
for (int k = sid; k <= eid; k ++)
{
if (mark[k] == 0) continue;
else
{
for (cnt; cnt <= r; cnt ++) dost(cnt);
}
}
}
else
{
int sid = id[l], eid = id[r], ans = 0, i = l;
for (int i = l; i <= r; )
{
if (i + sqrt(n) - 1 < r)
{
ans += sum[id[i]];
i += sqrt(n);
}
else
{
ans += a[i];
i ++;
}
}
cout << ans << "\n";
}
}
return 0;
}
是P4514的代码,主页也有求助帖,看到的大佬可以到主页帮帮我【玄关】