link:
Meaning of the questions:
Length of a given number of columns, and n operation, square root operation involves interval, the summation interval.
Ideas:
After five consider prescribing is 1, that is, considering the number of times the square root of a whole range of range of less than 5 times the square root of violence, regardless of his otherwise.
Code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
//#include <memory.h>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
#include <stack>
#include <string>
#include <assert.h>
#include <iomanip>
#define MINF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
LL a[MAXN], Tag[MAXN], Sum[MAXN];
LL Belong[MAXN];
int n, part;
void Update(LL l, LL r, LL c)
{
if (Tag[Belong[l]] < 5)
for (int i = l;i <= min(Belong[l]*part, r);i++)
{
Sum[Belong[i]] -= a[i];
a[i] = sqrt(a[i]);
Sum[Belong[i]] += a[i];
}
if (Belong[l] != Belong[r])
{
if (Tag[Belong[r]] < 5)
for (int i = max((Belong[r]-1)*part+1, l);i <= r;i++)
{
Sum[Belong[i]] -= a[i];
a[i] = sqrt(a[i]);
Sum[Belong[i]] += a[i];
}
}
for (int i = Belong[l]+1;i <= Belong[r]-1;i++)
{
if (Tag[i] < 5)
{
Tag[i]++;
for (int j = (i-1)*part+1;j <= i*part;j++)
{
Sum[i] -= a[j];
a[j] = sqrt(a[j]);
Sum[i] += a[j];
}
}
}
}
LL Query(LL l, LL r, LL c)
{
LL res = 0;
for (int i = l;i <= min(Belong[l]*part, r);i++)
res += a[i];
if (Belong[l] != Belong[r])
{
for (int i = max((Belong[r]-1)*part+1, l);i <= r;i++)
res += a[i];
}
for (int i = Belong[l]+1;i <= Belong[r]-1;i++)
res += Sum[i];
return res;
}
int main()
{
scanf("%d", &n);
part = sqrt(n);
for (int i = 1;i <= n;i++)
{
scanf("%lld", &a[i]);
Belong[i] = (i-1)/part + 1;
Sum[Belong[i]] += a[i];
}
int op, l, r, c;
for (int i = 1;i <= n;i++)
{
scanf("%d", &op);
if (op == 0)
{
scanf("%d%d%d", &l, &r, &c);
Update(l, r, c);
}
else
{
scanf("%d%d%d", &l, &r, &c);
printf("%lld\n", Query(l, r, c));
}
}
return 0;
}