Queries to update Subarrays of a given Array using Disjoint Set
Last Updated :
19 Sep, 2023
Given an array arr[] consisting of N integers, consisting only of 0‘s initially and queries Q[][] of the form {L, R, C}, the task for each query is to update the subarray [L, R] with value C. Print the final array generated after performing all the queries.
Examples:
Input: N = 5, Q = {{1, 4, 1}, {3, 5, 2}, {2, 4, 3}}
Output: 1 3 3 3 2
Explanation:
Initially, the array is {0, 0, 0, 0, 0}
Query 1 modifies the array to {1, 1, 1, 1, 0}
Query 2 modifies the array to {1, 1, 2, 2, 2}
Query 3 modifies the array to {1, 3, 3, 3, 2}
Input: N = 3, Q = {{1, 2, 1}, {2, 3, 2}}
Output: 1 2 2
Explanation:
Initially, the array is {0, 0, 0}
Query 1 modifies the array to {1, 1, 0}
Query 2 modifies the array to {1, 2, 2}
Approach: The idea is to use Disjoint Set Union to solve the problem.Follow the steps below to solve the problem:
- Initially, all the array elements will be considered as separate sets and parent of itself and will store the next array element with value 0.
- First, store the query and process the queries in reverse order from last to first because the value assigned to each set will be final.
- After processing the first query, elements with the changed value will point to the next element. This way on executing a query, we only have to assign values to the non-updated sets in the subarray [l, r]. All other cells already contain their final values.
- Find the left-most non-updated set, and update it, and with the pointer, move to the next non-updated set to the right.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define MAX_NODES 100005
int parent[MAX_NODES];
int final_val[MAX_NODES];
struct query {
int l, r, c;
};
void make_set( int v)
{
parent[v] = v;
}
int find_set( int v)
{
if (v == parent[v])
return v;
return parent[v] = find_set(parent[v]);
}
void Initialize( int n)
{
for ( int i = 0; i <= n; i++)
make_set(i + 1);
}
void Process(query Q[], int q)
{
for ( int i = q - 1; i >= 0; i--) {
int l = Q[i].l, r = Q[i].r, c = Q[i].c;
for ( int v = find_set(l); v <= r;
v = find_set(v)) {
final_val[v] = c;
parent[v] = v + 1;
}
}
}
void PrintAns( int n)
{
for ( int i = 1; i <= n; i++) {
cout << final_val[i] << " " ;
}
cout << endl;
}
int main()
{
int n = 5;
Initialize(n);
int q = 3;
query Q[q];
Q[0].l = 1, Q[0].r = 4, Q[0].c = 1;
Q[1].l = 3, Q[1].r = 5, Q[1].c = 2;
Q[2].l = 2, Q[2].r = 4, Q[2].c = 3;
Process(Q, q);
PrintAns(n);
return 0;
}
|
Java
import java.util.*;
class GFG{
static final int MAX_NODES = 100005 ;
static int []parent = new int [MAX_NODES];
static int []final_val = new int [MAX_NODES];
static class query
{
int l, r, c;
};
static void make_set( int v)
{
parent[v] = v;
}
static int find_set( int v)
{
if (v == parent[v])
return v;
return parent[v] = find_set(parent[v]);
}
static void Initialize( int n)
{
for ( int i = 0 ; i <= n; i++)
make_set(i + 1 );
}
static void Process(query Q[], int q)
{
for ( int i = q - 1 ; i >= 0 ; i--)
{
int l = Q[i].l, r = Q[i].r, c = Q[i].c;
for ( int v = find_set(l); v <= r;
v = find_set(v))
{
final_val[v] = c;
parent[v] = v + 1 ;
}
}
}
static void PrintAns( int n)
{
for ( int i = 1 ; i <= n; i++)
{
System.out.print(final_val[i] + " " );
}
System.out.println();
}
public static void main(String[] args)
{
int n = 5 ;
Initialize(n);
int q = 3 ;
query []Q = new query[q];
for ( int i = 0 ; i < Q.length; i++)
Q[i] = new query();
Q[ 0 ].l = 1 ; Q[ 0 ].r = 4 ; Q[ 0 ].c = 1 ;
Q[ 1 ].l = 3 ; Q[ 1 ].r = 5 ; Q[ 1 ].c = 2 ;
Q[ 2 ].l = 2 ; Q[ 2 ].r = 4 ; Q[ 2 ].c = 3 ;
Process(Q, q);
PrintAns(n);
}
}
|
Python3
MAX_NODES = 100005
parent = [ 0 ] * MAX_NODES
final_val = [ 0 ] * MAX_NODES
def make_set(v):
parent[v] = v
def find_set(v):
if (v = = parent[v]):
return v
parent[v] = find_set(parent[v])
return parent[v]
def Initialize(n):
for i in range (n + 1 ):
make_set(i + 1 )
def Process(Q, q):
for i in range (q - 1 , - 1 , - 1 ):
l = Q[i][ 0 ]
r = Q[i][ 1 ]
c = Q[i][ 2 ]
v = find_set(l)
while v < = r:
final_val[v] = c
parent[v] = v + 1
v = find_set(v)
def PrintAns(n):
for i in range ( 1 , n + 1 ):
print (final_val[i], end = " " )
if __name__ = = '__main__' :
n = 5
Initialize(n)
q = 3
Q = [[ 0 for i in range ( 3 )]
for i in range (q)]
Q[ 0 ][ 0 ] = 1
Q[ 0 ][ 1 ] = 4
Q[ 0 ][ 2 ] = 1
Q[ 1 ][ 0 ] = 3
Q[ 1 ][ 1 ] = 5
Q[ 1 ][ 2 ] = 2
Q[ 2 ][ 0 ] = 2
Q[ 2 ][ 1 ] = 4
Q[ 2 ][ 2 ] = 3
Process(Q, q)
PrintAns(n)
|
C#
using System;
class GFG{
static readonly int MAX_NODES = 100005;
static int []parent = new int [MAX_NODES];
static int []final_val = new int [MAX_NODES];
class query
{
public int l, r, c;
};
static void make_set( int v)
{
parent[v] = v;
}
static int find_set( int v)
{
if (v == parent[v])
return v;
return parent[v] = find_set(parent[v]);
}
static void Initialize( int n)
{
for ( int i = 0; i <= n; i++)
make_set(i + 1);
}
static void Process(query []Q, int q)
{
for ( int i = q - 1; i >= 0; i--)
{
int l = Q[i].l, r = Q[i].r, c = Q[i].c;
for ( int v = find_set(l); v <= r;
v = find_set(v))
{
final_val[v] = c;
parent[v] = v + 1;
}
}
}
static void PrintAns( int n)
{
for ( int i = 1; i <= n; i++)
{
Console.Write(final_val[i] + " " );
}
Console.WriteLine();
}
public static void Main(String[] args)
{
int n = 5;
Initialize(n);
int q = 3;
query []Q = new query[q];
for ( int i = 0; i < Q.Length; i++)
Q[i] = new query();
Q[0].l = 1; Q[0].r = 4; Q[0].c = 1;
Q[1].l = 3; Q[1].r = 5; Q[1].c = 2;
Q[2].l = 2; Q[2].r = 4; Q[2].c = 3;
Process(Q, q);
PrintAns(n);
}
}
|
Javascript
<script>
let MAX_NODES = 100005;
let parent = new Array(MAX_NODES);
let final_val = new Array(MAX_NODES);
class query
{
constructor()
{
let l, r, c;
}
}
function make_set(v)
{
parent[v] = v;
}
function find_set(v)
{
if (v == parent[v])
return v;
return parent[v] = find_set(parent[v]);
}
function Initialize(n)
{
for (let i = 0; i <= n; i++)
make_set(i + 1);
}
function Process(Q,q)
{
for (let i = q - 1; i >= 0; i--)
{
let l = Q[i].l, r = Q[i].r, c = Q[i].c;
for (let v = find_set(l); v <= r;
v = find_set(v))
{
final_val[v] = c;
parent[v] = v + 1;
}
}
}
function PrintAns(n)
{
for (let i = 1; i <= n; i++)
{
document.write(final_val[i] + " " );
}
document.write( "<br>" );
}
let n = 5;
Initialize(n);
let q = 3;
let Q = new Array(q);
for (let i = 0; i < Q.length; i++)
Q[i] = new query();
Q[0].l = 1; Q[0].r = 4; Q[0].c = 1;
Q[1].l = 3; Q[1].r = 5; Q[1].c = 2;
Q[2].l = 2; Q[2].r = 4; Q[2].c = 3;
Process(Q, q);
PrintAns(n);
</script>
|
Time complexity: O(log N)
Auxiliary Space: O(MAX_NODES)
Share your thoughts in the comments
Please Login to comment...