using
System;
class
SegmentTree
{
public
int
SumOfSquares;
public
int
SumOfElement;
}
class
LazyTree
{
public
int
Change;
public
int
Type;
}
class
Program
{
static
int
Query(SegmentTree[] tree, LazyTree[] lazy,
int
start,
int
end,
int
low,
int
high,
int
treeIndex)
{
if
(lazy[treeIndex].Change != 0)
{
int
change = lazy[treeIndex].Change;
int
type = lazy[treeIndex].Type;
if
(lazy[treeIndex].Type == 0)
{
tree[treeIndex].SumOfSquares = (end - start + 1) * change * change;
tree[treeIndex].SumOfElement = (end - start + 1) * change;
if
(start != end)
{
lazy[2 * treeIndex].Change = change;
lazy[2 * treeIndex].Type = type;
lazy[2 * treeIndex + 1].Change = change;
lazy[2 * treeIndex + 1].Type = type;
}
}
else
{
tree[treeIndex].SumOfSquares += ((end - start + 1) * change * change) + (2 * change * tree[treeIndex].SumOfElement);
tree[treeIndex].SumOfElement += (end - start + 1) * change;
if
(start != end)
{
if
(lazy[2 * treeIndex].Change == 0 || lazy[2 * treeIndex].Type == 1)
{
lazy[2 * treeIndex].Change += change;
lazy[2 * treeIndex].Type = type;
}
else
{
lazy[2 * treeIndex].Change += change;
}
if
(lazy[2 * treeIndex + 1].Change == 0 || lazy[2 * treeIndex + 1].Type == 1)
{
lazy[2 * treeIndex + 1].Change += change;
lazy[2 * treeIndex + 1].Type = type;
}
else
{
lazy[2 * treeIndex + 1].Change += change;
}
}
}
lazy[treeIndex].Change = 0;
}
if
(start > high || end < low)
{
return
0;
}
if
(start >= low && high >= end)
{
return
tree[treeIndex].SumOfSquares;
}
int
mid = (start + end) / 2;
int
ans = Query(tree, lazy, start, mid, low, high, 2 * treeIndex);
int
ans1 = Query(tree, lazy, mid + 1, end, low, high, 2 * treeIndex + 1);
return
ans + ans1;
}
static
void
Update(
int
[] arr, SegmentTree[] tree, LazyTree[] lazy,
int
start,
int
end,
int
low,
int
high,
int
change,
int
type,
int
treeIndex)
{
if
(lazy[treeIndex].Change != 0)
{
int
lazyChange = lazy[treeIndex].Change;
int
lazyType = lazy[treeIndex].Type;
if
(lazy[treeIndex].Type == 0)
{
tree[treeIndex].SumOfSquares = (end - start + 1) * lazyChange * lazyChange;
tree[treeIndex].SumOfElement = (end - start + 1) * lazyChange;
if
(start != end)
{
lazy[2 * treeIndex].Change = lazyChange;
lazy[2 * treeIndex].Type = lazyType;
lazy[2 * treeIndex + 1].Change = lazyChange;
lazy[2 * treeIndex + 1].Type = lazyType;
}
}
else
{
tree[treeIndex].SumOfSquares += ((end - start + 1) * lazyChange * lazyChange) + (2 * lazyChange * tree[treeIndex].SumOfElement);
tree[treeIndex].SumOfElement += (end - start + 1) * lazyChange;
if
(start != end)
{
if
(lazy[2 * treeIndex].Change == 0 || lazy[2 * treeIndex].Type == 1)
{
lazy[2 * treeIndex].Change += lazyChange;
lazy[2 * treeIndex].Type = lazyType;
}
else
{
lazy[2 * treeIndex].Change += lazyChange;
}
if
(lazy[2 * treeIndex + 1].Change == 0 || lazy[2 * treeIndex + 1].Type == 1)
{
lazy[2 * treeIndex + 1].Change += lazyChange;
lazy[2 * treeIndex + 1].Type = lazyType;
}
else
{
lazy[2 * treeIndex + 1].Change += lazyChange;
}
}
}
lazy[treeIndex].Change = 0;
}
if
(start > high || end < low)
{
return
;
}
if
(start >= low && high >= end)
{
if
(type == 0)
{
tree[treeIndex].SumOfSquares = (end - start + 1) * change * change;
tree[treeIndex].SumOfElement = (end - start + 1) * change;
if
(start != end)
{
lazy[2 * treeIndex].Change = change;
lazy[2 * treeIndex].Type = type;
lazy[2 * treeIndex + 1].Change = change;
lazy[2 * treeIndex + 1].Type = type;
}
}
else
{
tree[treeIndex].SumOfSquares += ((end - start + 1) * change * change) + (2 * change * tree[treeIndex].SumOfElement);
tree[treeIndex].SumOfElement += (end - start + 1) * change;
if
(start != end)
{
if
(lazy[2 * treeIndex].Change == 0 || lazy[2 * treeIndex].Type == 1)
{
lazy[2 * treeIndex].Change += change;
lazy[2 * treeIndex].Type = type;
}
else
{
lazy[2 * treeIndex].Change += change;
}
if
(lazy[2 * treeIndex + 1].Change == 0 || lazy[2 * treeIndex + 1].Type == 1)
{
lazy[2 * treeIndex + 1].Change += change;
lazy[2 * treeIndex + 1].Type = type;
}
else
{
lazy[2 * treeIndex + 1].Change += change;
}
}
}
return
;
}
int
mid = (start + end) / 2;
Update(arr, tree, lazy, start, mid, low, high, change, type, 2 * treeIndex);
Update(arr, tree, lazy, mid + 1, end, low, high, change, type, 2 * treeIndex + 1);
tree[treeIndex].SumOfSquares = tree[2 * treeIndex].SumOfSquares + tree[2 * treeIndex + 1].SumOfSquares;
tree[treeIndex].SumOfElement = tree[2 * treeIndex].SumOfElement + tree[2 * treeIndex + 1].SumOfElement;
}
static
void
Create(
int
[] arr, SegmentTree[] tree,
int
start,
int
end,
int
treeIndex)
{
if
(start == end)
{
tree[treeIndex].SumOfSquares = start * start;
tree[treeIndex].SumOfElement = start;
return
;
}
int
mid = (start + end) / 2;
Create(arr, tree, start, mid, treeIndex * 2);
Create(arr, tree, mid + 1, end, 2 * treeIndex + 1);
tree[treeIndex].SumOfSquares = tree[treeIndex * 2].SumOfSquares + tree[2 * treeIndex + 1].SumOfSquares;
tree[treeIndex].SumOfElement = tree[treeIndex * 2].SumOfElement + tree[2 * treeIndex + 1].SumOfElement;
}
static
void
Main()
{
int
t;
if
(
int
.TryParse(Console.ReadLine(),
out
t))
{
int
case1 = 1;
while
(t-- > 0)
{
Console.WriteLine($
"Case {case1++}:"
);
string
[] input = Console.ReadLine()?.Split() ?? Array.Empty<
string
>();
if
(input.Length >= 2)
{
int
n;
int
q;
if
(
int
.TryParse(input[0],
out
n) &&
int
.TryParse(input[1],
out
q))
{
int
[] arr =
new
int
[n + 1];
input = Console.ReadLine()?.Split() ?? Array.Empty<
string
>();
for
(
int
i = 1; i <= n; i++)
{
if
(
int
.TryParse(input[i - 1],
out
arr[i]) ==
false
)
{
Console.WriteLine(
"Invalid input for array element."
);
return
;
}
}
SegmentTree[] tree =
new
SegmentTree[2 * n];
LazyTree[] lazy =
new
LazyTree[2 * n];
Create(arr, tree, 1, n, 1);
while
(q-- > 0)
{
int
type;
if
(
int
.TryParse(Console.ReadLine(),
out
type))
{
if
(type == 2)
{
input = Console.ReadLine()?.Split() ?? Array.Empty<
string
>();
if
(input.Length >= 2)
{
int
start;
int
end;
if
(
int
.TryParse(input[0],
out
start) &&
int
.TryParse(input[1],
out
end))
{
Console.WriteLine(Query(tree, lazy, 1, n, start, end, 1));
}
else
{
Console.WriteLine(
"Invalid input for query."
);
return
;
}
}
}
else
{
input = Console.ReadLine()?.Split() ?? Array.Empty<
string
>();
if
(input.Length >= 3)
{
int
start;
int
end;
int
change;
if
(
int
.TryParse(input[0],
out
start) &&
int
.TryParse(input[1],
out
end) &&
int
.TryParse(input[2],
out
change))
{
Update(arr, tree, lazy, 1, n, start, end, change, type, 1);
}
else
{
Console.WriteLine(
"Invalid input for update."
);
return
;
}
}
}
}
}
}
else
{
Console.WriteLine(
"Invalid input for n and q."
);
return
;
}
}
}
}
}
}