using
System;
using
System.Collections.Generic;
using
System.Linq;
public
class
Pair<A, B>
{
private
A first;
private
B second;
public
Pair(A first, B second)
{
this
.first = first;
this
.second = second;
}
public
A GetFirst()
{
return
first;
}
public
B GetSecond()
{
return
second;
}
}
public
class
MoAlgorithmWithUpdates
{
public
static
List<
int
> MoAlgorithmWithUpdate(List<
int
> array, List<Pair<
int
,
int
>> queries, List<Pair<
int
,
int
>> updates)
{
int
blockSize = (
int
)Math.Sqrt(array.Count);
List<List<
int
>> blocks =
new
List<List<
int
>>();
for
(
int
i = 0; i < array.Count; i += blockSize)
{
blocks.Add(array.GetRange(i, Math.Min(blockSize, array.Count - i)));
}
List<
int
> answers =
new
List<
int
>();
foreach
(Pair<
int
,
int
> query
in
queries)
{
int
start = query.GetFirst();
int
end = query.GetSecond();
int
startBlock = start / blockSize;
int
endBlock = end / blockSize;
int
answer = 0;
if
(startBlock == endBlock)
{
for
(
int
i = start; i <= end; i++)
{
answer += array[i];
}
}
else
{
for
(
int
i = start; i < (startBlock + 1) * blockSize; i++)
{
answer += array[i];
}
for
(
int
i = startBlock + 1; i < endBlock; i++)
{
answer += blocks[i].Sum();
}
for
(
int
i = endBlock * blockSize; i <= end; i++)
{
answer += array[i];
}
}
answers.Add(answer);
}
foreach
(Pair<
int
,
int
> update
in
updates)
{
int
index = update.GetFirst();
int
value = update.GetSecond();
int
blockIndex = index / blockSize;
array[index] = value;
int
startRange = blockIndex * blockSize;
int
endRange = Math.Min((blockIndex + 1) * blockSize, array.Count);
blocks[blockIndex] =
new
List<
int
>(array.GetRange(startRange, endRange - startRange));
}
return
answers;
}
public
static
void
Main(
string
[] args)
{
List<
int
> array = Enumerable.Range(0, 100).Select(_ =>
new
Random().Next(0, 101)).ToList();
List<Pair<
int
,
int
>> queries =
new
List<Pair<
int
,
int
>>();
Random rand =
new
Random();
for
(
int
i = 0; i < 10; i++)
{
int
start = rand.Next(100);
int
end = rand.Next(100);
queries.Add(
new
Pair<
int
,
int
>(Math.Min(start, end), Math.Max(start, end)));
}
List<Pair<
int
,
int
>> updates =
new
List<Pair<
int
,
int
>>();
for
(
int
i = 0; i < 5; i++)
{
int
index = rand.Next(100);
int
value = rand.Next(101);
updates.Add(
new
Pair<
int
,
int
>(index, value));
}
List<
int
> answersWithUpdate = MoAlgorithmWithUpdate(array, queries, updates);
Console.WriteLine(
"Answers with update:"
);
foreach
(
int
answer
in
answersWithUpdate)
{
Console.WriteLine(answer);
}
}
}