GoConqr has a new look! Let us know what you think.

Notes

Rearrangement

Aditya Awasthi Data Structure English 1 page

Content of the notes (1)

Page 1

Program -8 :Search an element in a sorted and rotated array

Ans - An element in a sorted array can be found in O(log n) time via binary search. But suppose we rotate an ascending order sorted array at some pivot unknown to you beforehand. So for instance, 1 2 3 4 5 might become 3 4 5 1 2. Devise a way to find an element in the rotated array in O(log n) time.

/* Java program to search an element

in a sorted and pivoted array*/

class Main

{

/* Searches an element key in a

pivoted sorted array arrp[]

of size n */

static int pivotedBinarySearch(int arr[], int n, int key)

{

int pivot = findPivot(arr, 0, n-1);

// If we didn't find a pivot, then

// array is not rotated at all

if (pivot == -1)

return binarySearch(arr, 0, n-1, key);

// If we found a pivot, then first

// compare with pivot and then

// search in two subarrays around pivot

if (arr[pivot] == key)

return pivot;

if (arr[0] <= key)

return binarySearch(arr, 0, pivot-1, key);

return binarySearch(arr, pivot+1, n-1, key);

}

/* Function to get pivot. For array

3, 4, 5, 6, 1, 2 it returns

3 (index of 6) */

static int findPivot(int arr[], int low, int high)

{

// base cases

if (high < low)

return -1;

if (high == low)

return low;

/* low + (high - low)/2; */

int mid = (low + high)/2;

if (mid < high && arr[mid] > arr[mid + 1])

return mid;

if (mid > low && arr[mid] < arr[mid - 1])

return (mid-1);

if (arr[low] >= arr[mid])

return findPivot(arr, low, mid-1);

return findPivot(arr, mid + 1, high);

}

/* Standard Binary Search function */

static int binarySearch(int arr[], int low, int high, int key)

{

if (high < low)

return -1;

/* low + (high - low)/2; */

int mid = (low + high)/2;

if (key == arr[mid])

return mid;

if (key > arr[mid])

return binarySearch(arr, (mid + 1), high, key);

return binarySearch(arr, low, (mid -1), key);

}

// main function

public static void main(String args[])

{

// Let us search 3 in below array

int arr1[] = {5, 6, 7, 8, 9, 10, 1, 2, 3};

int n = arr1.length;

int key = 3;

System.out.println("Index of the element is: " + pivotedBinarySearch(arr1, n, key));

}

}

Program-9: Given a sorted and rotated array, find if there is a pair with a given sum

Ans: Input: arr[] = {11, 15, 6, 8, 9, 10}, x = 16

Output: true

There is a pair (6, 10) with sum 16

Input: arr[] = {11, 15, 26, 38, 9, 10}, x = 35

Output: true

There is a pair (26, 9) with sum 35

bool pairInSortedRotated(int arr[], int n, int x)

{

// Find the pivot element

int i;

for (i=0; i<n-1; i++)

if (arr[i] > arr[i+1])

break;

int l = (i+1)%n; // l is now index of minimum element

int r = i; // r is now index of maximum element

// Keep moving either l or r till they meet

while (l != r)

{

// If we find a pair with sum x, we return true

if (arr[l] + arr[r] == x)

return true;

// If current pair sum is less, move to the higher sum

if (arr[l] + arr[r] < x)

l = (l + 1)%n;

else // Move to the lower sum side

r = (n + r - 1)%n;

}

return false;

}

Program-10 : Find maximum value of Sum( i*arr[i]) with only rotations on given array allowed

Ans - Input: arr[] = {1, 20, 2, 10}

Output: 72

We can 72 by rotating array twice.

{2, 10, 1, 20}

20*3 + 1*2 + 10*1 + 2*0 = 72

Input: arr[] = {10, 1, 2, 3, 4, 5, 6, 7, 8, 9};

Output: 330

We can 330 by rotating array 9 times.

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

0*1 + 1*2 + 2*3 ... 9*10 = 330

Let us calculate initial value of i*arr[i] with no rotation

R0 = 0*arr[0] + 1*arr[1] +...+ (n-1)*arr[n-1]

After 1 rotation arr[n-1], becomes first element of array, arr[0] becomes second element, arr[1] becomes third element and so on.

R1 = 0*arr[n-1] + 1*arr[0] +...+ (n-1)*arr[n-2]

R1 - R0 = arr[0] + arr[1] + ... + arr[n-2] - (n-1)*arr[n-1]

After 2 rotations arr[n-2], becomes first element of array, arr[n-1] becomes second element, arr[0] becomes third element and so on.

R2 = 0*arr[n-2] + 1*arr[n-1] +...+ (n?1)*arr[n-3]

R2 - R1 = arr[0] + arr[1] + ... + arr[n-3] - (n-1)*arr[n-2] + arr[n-1]

If we take a closer look at above values, we can observe below pattern

Rj - Rj-1 = arrSum - n * arr[n-j]

Where arrSum is sum of all array elements, i.e.,

arrSum = ? arr[i] i<=0<=n-1

static int maxSum()

{

// Find array sum and i*arr[i] with no rotation

int arrSum = 0; // Stores sum of arr[i]

int currVal = 0; // Stores sum of i*arr[i]

for (int i=0; i<arr.length; i++)

{

arrSum = arrSum + arr[i];

currVal = currVal+(i*arr[i]);

}

// Initialize result as 0 rotation sum

int maxVal = currVal;

// Try all rotations one by one and find

// the maximum rotation sum.

for (int j=1; j<arr.length; j++)

{

currVal = currVal + arrSum-arr.length*arr[arr.length-j];

if (currVal > maxVal)

maxVal = currVal;

}

// Return result

return maxVal;

}

Program 11- Rearrange positive and negative numbers in O(n) time and O(1) extra space

Ans - For example, if the input array is [-1, 2, -3, 4, 5, 6, -7, 8, 9], then the output should be [9, -7, 8, -3, 5, -1, 2, 4, 6]

static void rearrange(int arr[], int n)

{

// The following few lines are similar to partition

// process of QuickSort. The idea is to consider 0

// as pivot and divide the array around it.

int i = -1, temp = 0;

for (int j = 0; j < n; j++)

{

if (arr[j] < 0)

{

i++;

temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

}

// Now all positive numbers are at end and negative numbers at

// the beginning of array. Initialize indexes for starting point

// of positive and negative numbers to be swapped

int pos = i+1, neg = 0;

// Increment the negative index by 2 and positive index by 1, i.e.,

// swap every alternate negative number with next positive number

while (pos < n && neg < pos && arr[neg] < 0)

{

temp = arr[neg];

arr[neg] = arr[pos];

arr[pos] = temp;

pos++;

neg += 2;

}

}

Program 12- Sort an array according to absolute difference with given value

Ans-

Input : arr[] : x = 7, arr[] = {10, 5, 3, 9, 2}

Output : arr[] = {5, 9, 10, 3, 2}

Explanation:

7 - 10 = 3(abs)

7 - 5 = 2

7 - 3 = 4

7 - 9 = 2(abs)

7 - 2 = 5

So according to the difference with X,

elements are arranged as 5, 9, 10, 3, 2.

// C++ program to sort an array according absolute

// difference with x.

#include<bits/stdc++.h>

using namespace std;

// Function to sort an array according absolute

// difference with x.

void rearrange(int arr[], int n, int x)

{

multimap<int, int> m;

// Store values in a map with the difference

// with X as key

for (int i = 0 ; i < n; i++)

m.insert(make_pair(abs(x-arr[i]),arr[i]));

// Update the values of array

int i = 0;

for (auto it = m.begin(); it != m.end(); it++)

arr[i++] = (*it).second ;

}

// Function to print the array

void printArray(int arr[] , int n)

{

for (int i = 0 ; i < n; i++)

cout << arr[i] << " ";

}

// Driver code

int main()

{

int arr[] = {10, 5, 3, 9 ,2};

int n = sizeof(arr)/sizeof(arr[0]);

int x = 7;

rearrange(arr, n, x);

printArray(arr, n);

return 0;

}

Program-13 Three way partitioning of an array around a given range

Ans -

Input: arr[] = {1, 14, 5, 20, 4, 2, 54, 20, 87, 98, 3, 1, 32}

lowVal = 14, highVal = 20

Output: arr[] = {1, 5, 4, 2, 1, 3, 14, 20, 20, 98, 87, 32, 54}

public static void threeWayPartition(int[] arr, int lowVal, int highVal)

{

int n = arr.length;

// Initialize ext available positions for

// smaller (than range) and greater lements

int start = 0, end = n-1;

// Traverse elements from left

for(int i = 0; i < end;)

{

// If current element is smaller than

// range, put it on next available smaller

// position.

if(arr[i] < lowVal)

{

int temp = arr[start];

arr[start] = arr[i];

arr[i] = temp;

start++;

i++;

}

// If current element is greater than

// range, put it on next available greater

// position.

else if(arr[i] > highVal)

{

int temp = arr[end];

arr[end] = arr[i];

arr[i] = temp;

end--;

}

else

i++;

}

}

Program-14 Rearrange an array in maximum minimum form

Ans - Input : arr[] = {1, 2, 3, 4, 5, 6, 7}

Output : arr[] = {7, 1, 6, 2, 5, 3, 4}

static void rearrange(int[] arr, int n)

{

// Auxiliary array to hold modified array

int temp[] = new int[n];

// Indexes of smallest and largest elements

// from remaining array.

int small=0, large=n-1;

// To indicate whether we need to copy rmaining

// largest or remaining smallest at next position

boolean flag = true;

// Store result in temp[]

for (int i=0; i<n; i++)

{

if (flag)

temp[i] = arr[large--];

else

temp[i] = arr[small++];

flag = !flag;

}

// Copy temp[] to arr[]

arr = temp.clone();

}

Program-15 Rearrange an array in maximum minimum form | Set 2 (O(1) extra space)

Ans- Input : arr[] = {1, 2, 3, 4, 5, 6, 7}

Output : arr[] = {7, 1, 6, 2, 5, 3, 4}

void rearrange(int arr[], int n)

{

// initialize index of first minimum and first

// maximum element

int max_idx = n-1 , min_idx = 0 ;

// store maximum element of array

int max_elem = arr[n-1] + 1 ;

// traverse array elements

for (int i=0; i < n ; i++)

{

// at even index : we have to put maximum element

if (i % 2 == 0)

{

arr[i] += (arr[max_idx] % max_elem ) * max_elem;

max_idx--;

}

// at odd index : we have to put minimum element

else

{

arr[i] += (arr[min_idx] % max_elem ) * max_elem;

min_idx++;

}

}

// array elements back to it's original form

for (int i = 0 ; i < n; i++)

arr[i] = arr[i] / max_elem ;

}

Program-16 Maximum Length Bitonic Subarray | Set 1 (O(n) tine and O(n) space)

Ans- A[] = {12, 4, 78, 90, 45, 23}, the maximum length bitonic subarray is {4, 78, 90, 45, 23} which is of length 5.

static int bitonic(int arr[], int n)

{

int[] inc = new int[n]; // Length of increasing subarray ending

// at all indexes

int[] dec = new int[n]; // Length of decreasing subarray starting

// at all indexes

int max;

// Length of increasing sequence ending at first index is 1

inc[0] = 1;

// Length of increasing sequence starting at first index is 1

dec[n-1] = 1;

// Step 1) Construct increasing sequence array

for (int i = 1; i < n; i++)

inc[i] = (arr[i] >= arr[i-1])? inc[i-1] + 1: 1;

// Step 2) Construct decreasing sequence array

for (int i = n-2; i >= 0; i--)

dec[i] = (arr[i] >= arr[i+1])? dec[i+1] + 1: 1;

// Step 3) Find the length of maximum length bitonic sequence

max = inc[0] + dec[0] - 1;

for (int i = 1; i < n; i++)

if (inc[i] + dec[i] - 1 > max)

max = inc[i] + dec[i] - 1;

return max;

}

Program-17 Maximize sum of consecutive differences in a circular array

Ans- Input : arr[] = { 4, 2, 1, 8 }

Output : 18

Rearrange given array as : { 1, 8, 2, 4 }

Sum of difference between consecutive element

= |1 - 8| + |8 - 2| + |2 - 4| + |4 - 1|

= 7 + 6 + 2 + 3

= 18.

static int maxSum(int arr[], int n)

{

int sum = 0;

// Sorting the array.

Arrays.sort(arr);

// Subtracting a1, a2, a3,....., a(n/2)-1,

// an/2 twice and adding a(n/2)+1, a(n/2)+2,

// a(n/2)+3,....., an - 1, an twice.

for (int i = 0; i < n/2; i++)

{

sum -= (2 * arr[i]);

sum += (2 * arr[n - i - 1]);

}

return sum;

}

Program-18 Alternative Sorting

Ans- Input : arr[] = {7, 1, 2, 3, 4, 5, 6}

Output : 7 1 6 2 5 3 4

static void alternateSort(int arr[], int n)

{

Arrays.sort(arr);

// Printing the last element of array

// first and then first element and then

// second last element and then second

// element and so on.

int i = 0, j = n-1;

while (i < j) {

System.out.print(arr[j--] + " ");

System.out.print(arr[i++] + " ");

}

// If the total element in array is odd

// then print the last middle element.

if (n % 2 != 0)

System.out.print(arr[i]);

}

Program-19 Segregate 0s and 1s in an array

Ans- Input array = [0, 1, 0, 1, 0, 0, 1, 1, 1, 0]

Output array = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]

static void segregate0and1(int arr[], int n)

{

int count = 0; // counts the no of zeros in arr

for (int i = 0; i < n; i++) {

if (arr[i] == 0)

count++;

}

// loop fills the arr with 0 until count

for (int i = 0; i < count; i++)

arr[i] = 0;

// loop fills remaining arr space with 1

for (int i = count; i < n; i++)

arr[i] = 1;

}

Program-20 Segregate Even and Odd numbers

Ans- Input = {12, 34, 45, 9, 8, 90, 3}

Output = {12, 34, 8, 90, 45, 9, 3}

static void segregateEvenOdd(int arr[])

{

/* Initialize left and right indexes */

int left = 0, right = arr.length - 1;

while (left < right)

{

/* Increment left index while we see 0 at left */

while (arr[left]%2 == 0 && left < right)

left++;

/* Decrement right index while we see 1 at right */

while (arr[right]%2 == 1 && left < right)

right--;

if (left < right)

{

/* Swap arr[left] and arr[right]*/

int temp = arr[left];

arr[left] = arr[right];

arr[right] = temp;

left++;

right--;

}

}

}

Program-21 Replace every element with the greatest element on right side

Ans- {16, 17, 4, 3, 5, 2} - {17, 5, 5, 5, 2, -1}

static void nextGreatest(int arr[])

{

int size = arr.length;

// Initialize the next greatest element

int max_from_right = arr[size-1];

// The next greatest element for the rightmost

// element is always -1

arr[size-1] = -1;

// Replace all other elements with the next greatest

for (int i = size-2; i >= 0; i--)

{

// Store the current element (needed later for

// updating the next greatest element)

int temp = arr[i];

// Replace current element with the next greatest

arr[i] = max_from_right;

// Update the greatest element, if needed

if(max_from_right < temp)

max_from_right = temp;

}

}

Program-22 Find a sorted subsequence of size 3 in linear time

Ans- Input: arr[] = {12, 11, 10, 5, 6, 2, 30}

Output: 5, 6, 30

static void find3Numbers(int arr[])

{

int n = arr.length;

int max = n-1; //Index of maximum element from right side

int min = 0; //Index of minimum element from left side

int i;

// Create an array that will store index of a smaller

// element on left side. If there is no smaller element

// on left side, then smaller[i] will be -1.

int[] smaller = new int[n];

smaller[0] = -1; // first entry will always be -1

for (i = 1; i < n; i++)

{

if (arr[i] <= arr[min])

{

min = i;

smaller[i] = -1;

}

else

smaller[i] = min;

}

// Create another array that will store index of a

// greater element on right side. If there is no greater

// element on right side, then greater[i] will be -1.

int[] greater = new int[n];

greater[n-1] = -1; // last entry will always be -1

for (i = n-2; i >= 0; i--)

{

if (arr[i] >= arr[max])

{

max = i;

greater[i] = -1;

}

else

greater[i] = max;

}

// Now find a number which has both a greater number

// on right side and smaller number on left side

for (i = 0; i < n; i++)

{

if (smaller[i] != -1 && greater[i] != -1)

{

System.out.print(arr[smaller[i]]+" "+

arr[i]+" "+ arr[greater[i]]);

return;

}

}

// If we reach number, then there are no such 3 numbers

System.out.println("No such triplet found");

return;

}

Program-23 Largest subarray with equal number of 0s and 1s

Ans- Input: arr[] = {1, 0, 1, 1, 1, 0, 0}

Output: 1 to 6 (Starting and Ending indexes of output subarray)

int maxLen(int arr[], int n)

{

// Creates an empty hashMap hM

HashMap<Integer, Integer> hM = new HashMap<Integer, Integer>();

int sum = 0; // Initialize sum of elements

int max_len = 0; // Initialize result

int ending_index = -1;

int start_index = 0;

for (int i = 0; i < n; i++)

{

arr[i] = (arr[i] == 0) ? -1 : 1;

}

// Traverse through the given array

for (int i = 0; i < n; i++)

{

// Add current element to sum

sum += arr[i];

// To handle sum=0 at last index

if (sum == 0)

{

max_len = i + 1;

ending_index = i;

}

// If this sum is seen before, then update max_len

// if required

if (hM.containsKey(sum))

{

if (max_len < i - hM.get(sum + n))

{

max_len = i - hM.get(sum + n);

ending_index = i;

}

}

else // Else put this sum in hash table

hM.put(sum + n, i);

}

for (int i = 0; i < n; i++)

{

arr[i] = (arr[i] == -1) ? 0 : 1;

}

int end = ending_index - max_len + 1;

System.out.println(end + " to " + ending_index);

return max_len;

}

Program-24 Sort elements by frequency

Ans- {2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12}, then modify the array to {3, 3, 3, 3, 2, 2, 2, 12, 12, 4, 5}.

Following is detailed algorithm.

1) Create a BST and while creating BST maintain the count i,e frequency of each coming element in same BST. This step may take O(nLogn) time if a self balancing BST is used.

2) Do Inorder traversal of BST and store every element and count of each element in an auxiliary array. Let us call the auxiliary array as ‘count[]’. Note that every element of this array is element and frequency pair. This step takes O(n) time.

3) Sort ‘count[]’ according to frequency of the elements. This step takes O(nLohn) time if a O(nLogn) sorting algorithm is used.

4) Traverse through the sorted array ‘count[]’. For each element x, print it ‘freq’ times where ‘freq’ is frequency of x. This step takes O(n) time

Program-25 Merge k sorted arrays

Ans- Input: k = 3, n = 4

arr[][] = { {1, 3, 5, 7},

{2, 4, 6, 8},

{0, 9, 10, 11}} ;

Output: 0 1 2 3 4 5 6 7 8 9 10 11

1. Create an output array of size n*k.

2. Create a min heap of size k and insert 1st element in all the arrays into a the heap

3. Repeat following steps n*k times.

a) Get minimum element from heap (minimum is always at root) and store it in output array.

b) Replace heap root with next element from the array from which the element is extracted. If the array doesn’t have any more elements, then replace root with infinite. After replacing the root, heapify the tree.

Program-26 Sort an array according to the order defined by another array

Ans- Input: A1[] = {2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8}

A2[] = {2, 1, 8, 3}

Output: A1[] = {2, 2, 1, 1, 8, 8, 3, 5, 6, 7, 9}

/* A Binary Search based function to find index of FIRST occurrence

of x in arr[]. If x is not present, then it returns -1 */

int first(int arr[], int low, int high, int x, int n)

{

if (high >= low)

{

int mid = low + (high-low)/2; /* (low + high)/2; */

if ((mid == 0 || x > arr[mid-1]) && arr[mid] == x)

return mid;

if (x > arr[mid])

return first(arr, (mid + 1), high, x, n);

return first(arr, low, (mid -1), x, n);

}

return -1;

}

// Sort A1[0..m-1] according to the order defined by A2[0..n-1].

void sortAccording(int A1[], int A2[], int m, int n)

{

// The temp array is used to store a copy of A1[] and visited[]

// is used mark the visited elements in temp[].

int temp[m], visited[m];

for (int i=0; i<m; i++)

{

temp[i] = A1[i];

visited[i] = 0;

}

// Sort elements in temp

sort(temp, temp + m);

int ind = 0; // for index of output which is sorted A1[]

// Consider all elements of A2[], find them in temp[]

// and copy to A1[] in order.

for (int i=0; i<n; i++)

{

// Find index of the first occurrence of A2[i] in temp

int f = first(temp, 0, m-1, A2[i], m);

// If not present, no need to proceed

if (f == -1) continue;

// Copy all occurrences of A2[i] to A1[]

for (int j = f; (j<m && temp[j]==A2[i]); j++)

{

A1[ind++] = temp[j];

visited[j] = 1;

}

}

// Now copy all items of temp[] which are not present in A2[]

for (int i=0; i<m; i++)

if (visited[i] == 0)

A1[ind++] = temp[i];

}

Program-27 Find Index of 0 to be replaced with 1 to get longest continuous sequence of 1s in a binary array

Ans- Input: arr[] = {1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1}

Output: Index 9

static int maxOnesIndex(int arr[], int n)

{

int max_count = 0; // for maximum number of 1 around a zero

int max_index=0; // for storing result

int prev_zero = -1; // index of previous zero

int prev_prev_zero = -1; // index of previous to previous zero

// Traverse the input array

for (int curr=0; curr<n; ++curr)

{

// If current element is 0, then calculate the difference

// between curr and prev_prev_zero

if (arr[curr] == 0)

{

// Update result if count of 1s around prev_zero is more

if (curr - prev_prev_zero > max_count)

{

max_count = curr - prev_prev_zero;

max_index = prev_zero;

}

// Update for next iteration

prev_prev_zero = prev_zero;

prev_zero = curr;

}

}

// Check for the last encountered zero

if (n-prev_prev_zero > max_count)

max_index = prev_zero;

return max_index;

}

Program-28 Generate all possible sorted arrays from alternate elements of two given sorted arrays

Ans- For Example

A = {10, 15, 25}

B = {1, 5, 20, 30}

The resulting arrays are:

10 20

10 20 25 30

10 30

15 20

15 20 25 30

15 30

25 30

void generateUtil(int A[], int B[], int C[], int i, int j, int m, int n,

int len, boolean flag)

{

if (flag) // Include valid element from A

{

// Print output if there is at least one 'B' in output array 'C'

if (len != 0)

printArr(C, len + 1);

// Recur for all elements of A after current index

for (int k = i; k < m; k++)

{

if (len == 0)

{

/* this block works for the very first call to include

the first element in the output array */

C[len] = A[k];

// don't increment lem as B is included yet

generateUtil(A, B, C, k + 1, j, m, n, len, !flag);

}

/* include valid element from A and recur */

else if (A[k] > C[len])

{

C[len + 1] = A[k];

generateUtil(A, B, C, k + 1, j, m, n, len + 1, !flag);

}

}

}

/* Include valid element from B and recur */

else

{

for (int l = j; l < n; l++)

{

if (B[l] > C[len])

{

C[len + 1] = B[l];

generateUtil(A, B, C, i, l + 1, m, n, len + 1, !flag);

}

}

}

}

/* Wrapper function */

void generate(int A[], int B[], int m, int n)

{

int C[] = new int[m + n];

/* output array */

generateUtil(A, B, C, 0, 0, m, n, 0, true);

}

Program-29 Minimum number of swaps required for arranging pairs adjacent to each other

Ans- Input: n = 3

pairs[] = {1->3, 2->6, 4->5} // 1 is partner of 3 and so on

arr[] = {3, 5, 6, 4, 1, 2}

Output: 2

We can get {3, 1, 5, 4, 6, 2} by swapping 5 & 6, and 6 & 1

1) If first and second elements are pair, then simply recur

for remaining n-1 pairs and return the value returned by

recursive call.

2) If first and second are NOT pair, then there are two ways to

arrange. So try both of them return the minimum of two.

a) Swap second with pair of first and recur for n-1 elements.

Let the value returned by recursive call be 'a'.

b) Revert the changes made by previous step.

c) Swap first with pair of second and recur for n-1 elements.

Let the value returned by recursive call be 'b'.

d) Revert the changes made by previous step before returning

control to parent call.

e) Return 1 + min(a, b)

Information

Description
Data Structure (Arrays) Note on Rearrangement, created by Aditya Awasthi on 15/11/2017.
Created by
Aditya Awasthi
Views
0
Rating

Feedback

What is it about?

What do you think of the new look?

How do you like it?