Rt,只对了一个点,但样例过了qwq,求查错
#include <bits/stdc++.h>
using namespace std;
long long n, m, l, r, opt;
long long a[1000005], k[1005], size;
long long awa(long long qwq)
{
return qwq - floor(sqrt(qwq));
}
long long belong(long long qwq)
{
return ceil(qwq * 1.0 / size);
}
void update()
{
while (l % size != 1)
{
k[belong(l)] -= awa(a[l]);
a[l] = floor(sqrt(a[l]));
++l;
}
while (r % size)
{
k[belong(r)] -= awa(a[r]);
a[r] = floor(sqrt(a[r]));
--r;
}
for (int i = belong(l); i <= belong(r); i++)
{
for (int j = 1; j <= size && k[i] > size; j++)
{
k[i] -= awa(a[(i - 1) * size + j]);
a[(i - 1) * size + j] = sqrt(a[(i - 1) * size + j]);
}
}
}
long long query()
{
long long ans = 0;
while (l % size != 1)
{
ans += a[l];
++l;
}
while (r % size)
{
ans += a[r];
--r;
}
for (int i = belong(l); i <= belong(r); i++)
ans += k[i];
return ans;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
size = ceil(sqrt(n));
for (int i = n + 1; i <= size * size; i++)
a[i] = 1;
for (int i = 1; i <= size; i++)
for (int j = 1; j <= size; j++)
k[i] += a[(i - 1) * size + j];
cin >> m;
for (int i = 1; i <= m; i++)
{
cin >> opt >> l >> r;
if (l > r)
swap(l, r);
if (opt == 0)
update();
if (opt == 1)
cout << query() << endl;
}
}
谢谢诸位大佬,蒟蒻感激不尽