using
System;
using
System.Collections.Generic;
public
class
GFG{
static
int
maxAns =
int
.MinValue;
static
int
Find(
int
[] parent,
int
a)
{
return
parent[a]
= (parent[a] == a)
? a
: (Find(
parent, parent[a]));
}
static
void
Union(
int
[] parent,
int
[] rank,
int
[] setSum,
int
a,
int
b)
{
a = Find(parent, a);
b = Find(parent, b);
if
(a == b)
return
;
if
(rank[a] > rank[b])
rank[a]++;
if
(rank[b] > rank[a]) {
int
x = a;
a = b;
b = x;
}
parent[b] = a;
setSum[a] += setSum[b];
}
static
void
maxValues(
int
[] arr,
int
[] queries,
int
N)
{
int
[] parent =
new
int
[N + 1];
int
[] rank =
new
int
[N + 1];
int
[] setSum =
new
int
[N + 1];
List<
int
> currMax =
new
List<
int
>();
for
(
int
i = 1; i < N + 1; i++) {
parent[i] = -1;
setSum[i] = arr[i - 1];
}
currMax.Add(0);
for
(
int
i = N - 1; i > 0; i--) {
if
(parent[queries[i]] == -1) {
parent[queries[i]] = queries[i];
}
if
(queries[i] - 1 >= 0
&& parent[queries[i] - 1] != -1) {
Union(parent, rank, setSum,
queries[i],
queries[i] - 1);
}
if
(queries[i] + 1 <= N
&& parent[queries[i] + 1] != -1) {
Union(parent, rank, setSum,
queries[i],
queries[i] + 1);
}
maxAns = Math.Max(setSum[queries[i]],
maxAns);
currMax.Add(maxAns);
}
for
(
int
i = currMax.Count - 1;
i >= 0; i--) {
Console.Write(currMax[i]+
" "
);
}
}
public
static
void
Main(String[] args)
{
int
[] arr = { 1, 3, 2, 5 };
int
[] queries = { 3, 4, 1, 2 };
int
N = arr.Length;
maxValues(arr, queries, N);
}
}