From 0bfe0a268885555195e717dcf47dbe0bccf25eae Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Mon, 7 Apr 2025 16:32:59 -0400 Subject: [PATCH 1/5] [Hacker Rank] Interview Preparation Kit: Dictionaries and Hashmaps: Frequency Queries. WIP --- .../FrequencyQueries.java | 104 +++++++++++++ .../FrequencyQueriesTest.java | 50 ++++++ .../frequency_queries.testcases.json | 68 ++++++++ .../frequency-queries.md | 145 ++++++++++++++++++ 4 files changed, 367 insertions(+) create mode 100644 algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java create mode 100644 algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java create mode 100644 algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcases.json create mode 100644 docs/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency-queries.md diff --git a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java new file mode 100644 index 0000000..5ced55f --- /dev/null +++ b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java @@ -0,0 +1,104 @@ +package ae.hackerrank.interview_preparation_kit.dictionaries_and_hashmaps; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * FrequencyQueries. + * + * @link Problem definition + * [[docs/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency-queries.md]] + */ +public class FrequencyQueries { + private FrequencyQueries() { + } + + private static final long __INITIAL__ = 1L; + + private static final int __INSERT__ = 1; + private static final int __DELETE__ = 2; + private static final int __SELECT__ = 3; + + private static final int __NOT_FOUND__ = 0; + private static final int __FOUND__ = 1; + private static final int __EXISTS__ = 1; + + /** + * FrequencyQueries. + */ + static List freqQuery(List> queries) { + List result = new ArrayList<>(); + Map valueFreqs = new HashMap<>(); + Map> freqMap = new HashMap<>(); + + for (List query : queries) { + int operation = query.get(0); + long value = query.get(1); + Long currentFreqCount = valueFreqs.getOrDefault(value, null); + Long newFreqCount; + Map currentFreq; + Map newFreq; + + switch (operation) { + case __INSERT__: + newFreqCount = (currentFreqCount == null ? __INITIAL__ : currentFreqCount + 1L); + valueFreqs.put(value, newFreqCount); + + // delete current value from frequency map + currentFreq = freqMap.getOrDefault(currentFreqCount, null); + if (currentFreq != null) { + currentFreq.remove(value); + if (currentFreq.isEmpty()) { + freqMap.remove(currentFreqCount); + } + } + + // add new value to frequency map + newFreq = freqMap.getOrDefault(newFreqCount, null); + if (newFreq == null) { + newFreq = new HashMap<>(); + newFreq.put(value, __EXISTS__); + freqMap.put(newFreqCount, newFreq); + } + + break; + case __DELETE__: + newFreqCount = (currentFreqCount == null ? 0L : currentFreqCount - 1L); + valueFreqs.put(value, newFreqCount); + + if (newFreqCount <= 0L) { + valueFreqs.remove(value); + } else { + valueFreqs.put(value, newFreqCount); + + // add new value to frequency map + newFreq = freqMap.getOrDefault(newFreqCount, null); + if (newFreq == null) { + newFreq = new HashMap<>(); + newFreq.put(value, __EXISTS__); + freqMap.put(newFreqCount, newFreq); + } + } + + // delete current value from frequency map + currentFreq = freqMap.getOrDefault(currentFreqCount, null); + if (currentFreq != null) { + currentFreq.remove(value); + if (currentFreq.isEmpty()) { + freqMap.remove(currentFreqCount); + } + } + break; + case __SELECT__: + result.add(freqMap.containsKey(value) ? __FOUND__ : __NOT_FOUND__); + break; + default: + break; + } + } + + return result; + } +} diff --git a/algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java b/algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java new file mode 100644 index 0000000..bd1bfa0 --- /dev/null +++ b/algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java @@ -0,0 +1,50 @@ +package ae.hackerrank.interview_preparation_kit.dictionaries_and_hashmaps; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.util.List; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; +import util.JsonLoader; + +@TestInstance(Lifecycle.PER_CLASS) +class FrequencyQueriesTest { + + public static class FrequencyQueriesTestCase { + public String title; + public List> input; + public List expected; + } + + List testCases; + + @BeforeAll + public void setup() throws IOException { + String path; + path = String.join("/", + "hackerrank", + "interview_preparation_kit", + "dictionaries_and_hashmaps", + "frequency_queries.testcases.json"); + + this.testCases = JsonLoader.loadJson(path, FrequencyQueriesTestCase.class); + } + + @Test + void testFrequencyQueries() { + List solutionFound; + + for (FrequencyQueriesTestCase test : testCases) { + solutionFound = FrequencyQueries.freqQuery(test.input); + + assertEquals(test.expected, solutionFound, + "%s(%s) answer must be: %s".formatted( + "FrequencyQueriesTest.freqQuery", + test.input, + test.expected)); + } + } +} diff --git a/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcases.json b/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcases.json new file mode 100644 index 0000000..658efdf --- /dev/null +++ b/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcases.json @@ -0,0 +1,68 @@ +[ + { + "title": "Sample Test Case 0", + "input": [ + [1, 5], + [1, 6], + [3, 2], + [1, 10], + [1, 10], + [1, 6], + [2, 5], + [3, 2] + ], + "expected": [0, 1] + }, + { + "title": "Sample Test Case 1", + "input": [ + [3, 4], + [2, 1003], + [1, 16], + [3, 1] + ], + "expected": [0, 1] + }, + { + "title": "Sample Test Case 2", + "input": [ + [1, 3], + [2, 3], + [3, 2], + [1, 4], + [1, 5], + [1, 5], + [1, 4], + [3, 2], + [2, 4], + [3, 2] + ], + "expected": [0, 1, 1] + }, + { + "title": "Sample Test Case 3", + "input": [ + [1, 3], + [1, 38], + [2, 1], + [1, 16], + [2, 1], + [2, 2], + [1, 64], + [1, 84], + [3, 1], + [1, 100], + [1, 10], + [2, 2], + [2, 1], + [1, 67], + [2, 2], + [3, 1], + [1, 99], + [1, 32], + [1, 58], + [3, 2] + ], + "expected": [1, 1, 0] + } +] diff --git a/docs/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency-queries.md b/docs/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency-queries.md new file mode 100644 index 0000000..1420d83 --- /dev/null +++ b/docs/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency-queries.md @@ -0,0 +1,145 @@ +# [Dictionaries and Hashmaps: Frequency Queries](https://www.hackerrank.com/challenges/frequency-queries) + +- Difficulty: `#medium` +- Category: `#ProblemSolvingIntermediate` `#dictionaries` `#hashmaps` + +You are given queries. Each query is of the form two integers described below: + +- `1 x`: Insert x in your data structure. +- `2 y`: Delete one occurence of y from your data structure, if present. +- `3 z`: Check if any integer is present whose frequency is exactly `z`. +If yes, print `1` else `0`. + +The queries are given in the form of a 2-D array `queries` of +size where `queries[i][0]` contains the operation, +and `queries[i][0]` contains the data element. + +## Example + +The results of each operation are: + +```text +Operation Array Output +(1,1) [1] +(2,2) [1] +(3,2) 0 +(1,1) [1,1] +(1,1) [1,1,1] +(2,1) [1,1] +(3,2) 1 +``` + +Return an array with the output: [0, 1]. + +## Function Description + +Complete the freqQuery function in the editor below. + +freqQuery has the following parameter(s): + +- `int queries[q][2]`: a 2-d array of integers + +## Returns + +- `int[]`: the results of queries of type `3` + +## Input Format + +The first line contains of an integer `q`, the number of queries. + +Each of the next `q` lines contains two space-separated integers, +`queries[i][0]` and `queries[i][1]`. + +## Constraints + +- $ 1 \leq q \leq 10^5 $ +- $ 1 \leq x, y, z \leq 10^9 $ +- All $ queries[i][0] \isin \{1, 2, 3\} $ +- $ 1 \leq queries[i][1] \leq 10^9 $ + +## Sample Input 0 + +```text +8 +1 5 +1 6 +3 2 +1 10 +1 10 +1 6 +2 5 +3 2 +``` + +## Sample Output 0 + +```text +0 +1 +``` + +## Explanation 0 + +For the first query of type `3`, there is no integer +whose frequency is `2` (`array = [5, 6]`). +So answer is `0`. + +For the second query of type `3`, there are two integers +in `array = [6, 10, 10, 6]` whose frequency is `2`(integer = `6` and `10`). +So, the answer is `1`. + +## Sample Input 1 + +```†ext +4 +3 4 +2 1003 +1 16 +3 1 +``` + +## Sample Output 1 + +```†ext +0 +1 +``` + +## Explanation 1 + +For the first query of type `3`, there is no integer of frequency `4`. +The answer is `0`. For the second query of type `3`, +there is one integer, `16` of frequency `1` so the answer is `1`. + +## Sample Input 2 + +```text +10 +1 3 +2 3 +3 2 +1 4 +1 5 +1 5 +1 4 +3 2 +2 4 +3 2 +``` + +## Sample Output 2 + +```text +0 +1 +1 + +``` + +## Explanation 2 + +When the first output query is run, the array is empty. +We insert two `4`'s and two `5`'s before the second output query, +`arr = [4, 5, 5, 4]` so there are two instances of elements occurring twice. +We delete a `4` and run the same query. +Now only the instances of `5` satisfy the query. From 42fac4fff1c13e1da526b4905b5189fa16884ee8 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Tue, 8 Apr 2025 21:44:05 -0400 Subject: [PATCH 2/5] [Hacker Rank] Interview Preparation Kit: Dictionaries and Hashmaps: Frequency Queries. WIP --- .../FrequencyQueries.java | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java index 5ced55f..5e191fc 100644 --- a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java +++ b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java @@ -23,7 +23,6 @@ private FrequencyQueries() { private static final int __NOT_FOUND__ = 0; private static final int __FOUND__ = 1; - private static final int __EXISTS__ = 1; /** * FrequencyQueries. @@ -31,65 +30,68 @@ private FrequencyQueries() { static List freqQuery(List> queries) { List result = new ArrayList<>(); Map valueFreqs = new HashMap<>(); - Map> freqMap = new HashMap<>(); + Map> freqMap = new HashMap<>(); for (List query : queries) { int operation = query.get(0); long value = query.get(1); + Long currentFreqCount = valueFreqs.getOrDefault(value, null); + List currentFreq = freqMap.getOrDefault(value, null); Long newFreqCount; - Map currentFreq; - Map newFreq; + List newFreq; switch (operation) { case __INSERT__: newFreqCount = (currentFreqCount == null ? __INITIAL__ : currentFreqCount + 1L); valueFreqs.put(value, newFreqCount); - // delete current value from frequency map - currentFreq = freqMap.getOrDefault(currentFreqCount, null); + newFreq = freqMap.getOrDefault(newFreqCount, null); + + // delete current frequency if (currentFreq != null) { - currentFreq.remove(value); - if (currentFreq.isEmpty()) { + freqMap.get(currentFreqCount).remove(value); + if (freqMap.get(currentFreqCount).isEmpty()) { freqMap.remove(currentFreqCount); } } - // add new value to frequency map - newFreq = freqMap.getOrDefault(newFreqCount, null); + // add new frequency if (newFreq == null) { - newFreq = new HashMap<>(); - newFreq.put(value, __EXISTS__); + newFreq = new ArrayList<>(); + newFreq.add(value); freqMap.put(newFreqCount, newFreq); + } else { + freqMap.get(newFreqCount).add(value); } break; case __DELETE__: - newFreqCount = (currentFreqCount == null ? 0L : currentFreqCount - 1L); - valueFreqs.put(value, newFreqCount); - - if (newFreqCount <= 0L) { - valueFreqs.remove(value); - } else { + newFreqCount = (currentFreqCount == null ? 0 : currentFreqCount - 1L); + if (newFreqCount > 0L) { valueFreqs.put(value, newFreqCount); - // add new value to frequency map newFreq = freqMap.getOrDefault(newFreqCount, null); + // add new frequency if (newFreq == null) { - newFreq = new HashMap<>(); - newFreq.put(value, __EXISTS__); + newFreq = new ArrayList<>(); + newFreq.add(value); freqMap.put(newFreqCount, newFreq); + } else { + freqMap.get(newFreqCount).add(value); } + } else { + valueFreqs.remove(value); } - // delete current value from frequency map - currentFreq = freqMap.getOrDefault(currentFreqCount, null); - if (currentFreq != null) { - currentFreq.remove(value); - if (currentFreq.isEmpty()) { + // delete current frequency + if (currentFreqCount != null) { + freqMap.get(currentFreqCount).remove(value); + if (freqMap.get(currentFreqCount).isEmpty()) { freqMap.remove(currentFreqCount); } } + break; case __SELECT__: result.add(freqMap.containsKey(value) ? __FOUND__ : __NOT_FOUND__); From 77c2c8b3d535145f5c9a488d21fe9bb52a500675 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Tue, 8 Apr 2025 21:44:05 -0400 Subject: [PATCH 3/5] =?UTF-8?q?[Hacker=20Rank]=20Interview=20Preparation?= =?UTF-8?q?=20Kit:=20Dictionaries=20and=20Hashmaps:=20Frequency=20Queries.?= =?UTF-8?q?=20Solved=20=E2=9C=93.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FrequencyQueries.java | 3 +- .../FrequencyQueriesTest.java | 24 + .../frequency_queries.testcase6.json | 5008 +++++++++++++++++ 3 files changed, 5033 insertions(+), 2 deletions(-) create mode 100644 algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase6.json diff --git a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java index 5e191fc..f58bd55 100644 --- a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java +++ b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java @@ -37,7 +37,6 @@ static List freqQuery(List> queries) { long value = query.get(1); Long currentFreqCount = valueFreqs.getOrDefault(value, null); - List currentFreq = freqMap.getOrDefault(value, null); Long newFreqCount; List newFreq; @@ -49,7 +48,7 @@ static List freqQuery(List> queries) { newFreq = freqMap.getOrDefault(newFreqCount, null); // delete current frequency - if (currentFreq != null) { + if (currentFreqCount != null) { freqMap.get(currentFreqCount).remove(value); if (freqMap.get(currentFreqCount).isEmpty()) { freqMap.remove(currentFreqCount); diff --git a/algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java b/algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java index bd1bfa0..e6b3053 100644 --- a/algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java +++ b/algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java @@ -20,6 +20,7 @@ public static class FrequencyQueriesTestCase { } List testCases; + List testCase6; @BeforeAll public void setup() throws IOException { @@ -31,6 +32,13 @@ public void setup() throws IOException { "frequency_queries.testcases.json"); this.testCases = JsonLoader.loadJson(path, FrequencyQueriesTestCase.class); + + path = String.join("/", + "hackerrank", + "interview_preparation_kit", + "dictionaries_and_hashmaps", + "frequency_queries.testcase6.json"); + this.testCase6 = JsonLoader.loadJson(path, FrequencyQueriesTestCase.class); } @Test @@ -47,4 +55,20 @@ void testFrequencyQueries() { test.expected)); } } + + @Test + void testFrequencyQueriesBigCases() { + List solutionFound; + + for (FrequencyQueriesTestCase test : testCase6) { + + solutionFound = FrequencyQueries.freqQuery(test.input); + + assertEquals(test.expected, solutionFound, + "%s(%s) answer must be: %s".formatted( + "FrequencyQueriesTest.freqQuery", + test.input, + test.expected)); + } + } } diff --git a/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase6.json b/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase6.json new file mode 100644 index 0000000..70845fc --- /dev/null +++ b/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase6.json @@ -0,0 +1,5008 @@ +[ + { + "title": "Test Case 6", + "input": [ + [1, 624], + [1, 980], + [2, 18], + [2, 13], + [2, 1], + [2, 3], + [1, 887], + [1, 184], + [3, 2], + [2, 17], + [2, 10], + [2, 1], + [2, 19], + [1, 763], + [2, 20], + [1, 476], + [2, 6], + [2, 1], + [2, 3], + [1, 994], + [3, 9], + [1, 155], + [2, 7], + [3, 14], + [3, 6], + [1, 495], + [1, 226], + [2, 1], + [3, 20], + [1, 434], + [2, 13], + [2, 3], + [1, 414], + [2, 2], + [1, 576], + [2, 6], + [3, 4], + [2, 14], + [3, 1], + [3, 18], + [3, 10], + [1, 31], + [1, 638], + [2, 8], + [2, 5], + [3, 9], + [3, 3], + [1, 751], + [2, 1], + [2, 18], + [2, 16], + [1, 229], + [3, 4], + [3, 2], + [1, 354], + [2, 9], + [3, 8], + [1, 580], + [1, 421], + [3, 7], + [1, 365], + [1, 434], + [1, 370], + [2, 10], + [2, 15], + [2, 17], + [1, 116], + [2, 11], + [3, 10], + [3, 8], + [1, 220], + [3, 20], + [2, 10], + [3, 9], + [2, 19], + [3, 15], + [2, 17], + [1, 674], + [1, 617], + [3, 9], + [3, 3], + [2, 12], + [1, 437], + [3, 6], + [1, 973], + [2, 10], + [2, 6], + [1, 81], + [2, 1], + [2, 6], + [3, 7], + [1, 86], + [2, 19], + [1, 228], + [2, 15], + [1, 566], + [3, 16], + [3, 2], + [2, 8], + [2, 6], + [2, 10], + [1, 967], + [2, 17], + [3, 11], + [1, 527], + [1, 747], + [1, 905], + [2, 3], + [2, 20], + [1, 521], + [3, 3], + [1, 442], + [2, 4], + [3, 19], + [1, 967], + [3, 17], + [2, 20], + [2, 4], + [3, 9], + [2, 1], + [2, 10], + [2, 7], + [2, 18], + [3, 20], + [3, 15], + [3, 12], + [2, 17], + [2, 10], + [3, 6], + [1, 724], + [1, 287], + [3, 7], + [1, 42], + [3, 15], + [3, 17], + [1, 920], + [3, 2], + [3, 2], + [1, 342], + [2, 1], + [3, 14], + [3, 16], + [3, 15], + [2, 18], + [3, 14], + [1, 893], + [2, 6], + [2, 6], + [3, 17], + [1, 986], + [1, 638], + [1, 66], + [1, 832], + [2, 15], + [2, 17], + [1, 906], + [2, 6], + [3, 14], + [3, 8], + [2, 11], + [1, 529], + [1, 494], + [2, 17], + [3, 3], + [1, 109], + [1, 966], + [1, 842], + [3, 2], + [1, 247], + [1, 536], + [2, 2], + [1, 752], + [1, 211], + [2, 8], + [1, 841], + [2, 17], + [3, 1], + [2, 18], + [1, 662], + [2, 9], + [1, 823], + [1, 299], + [1, 106], + [2, 15], + [3, 13], + [2, 2], + [2, 12], + [1, 290], + [2, 7], + [2, 19], + [3, 13], + [2, 16], + [1, 965], + [1, 481], + [1, 190], + [1, 425], + [3, 6], + [3, 11], + [1, 246], + [1, 44], + [3, 18], + [1, 199], + [1, 796], + [2, 1], + [2, 7], + [2, 8], + [3, 17], + [2, 19], + [2, 6], + [3, 10], + [1, 187], + [2, 8], + [1, 800], + [1, 292], + [1, 654], + [3, 4], + [3, 13], + [3, 6], + [3, 5], + [2, 20], + [3, 16], + [1, 337], + [1, 527], + [3, 20], + [2, 10], + [2, 16], + [3, 4], + [1, 615], + [2, 18], + [1, 669], + [2, 19], + [2, 8], + [1, 868], + [1, 806], + [1, 848], + [3, 6], + [2, 5], + [3, 16], + [1, 444], + [3, 2], + [3, 17], + [3, 10], + [2, 10], + [3, 16], + [3, 1], + [3, 15], + [2, 11], + [1, 145], + [3, 20], + [2, 15], + [2, 16], + [2, 16], + [3, 4], + [3, 2], + [1, 927], + [3, 13], + [3, 9], + [1, 351], + [1, 59], + [1, 799], + [2, 11], + [3, 9], + [3, 6], + [1, 590], + [3, 6], + [3, 5], + [3, 15], + [2, 11], + [3, 12], + [2, 18], + [2, 12], + [3, 8], + [1, 607], + [1, 13], + [3, 15], + [1, 879], + [2, 8], + [2, 5], + [2, 16], + [1, 879], + [1, 251], + [2, 11], + [3, 6], + [1, 174], + [1, 765], + [1, 733], + [3, 18], + [1, 465], + [2, 3], + [1, 677], + [3, 3], + [1, 805], + [3, 5], + [3, 20], + [1, 395], + [3, 11], + [3, 4], + [1, 929], + [1, 693], + [3, 15], + [3, 7], + [3, 4], + [3, 14], + [1, 865], + [1, 749], + [2, 8], + [1, 96], + [3, 8], + [2, 4], + [1, 471], + [3, 6], + [2, 15], + [2, 1], + [3, 4], + [3, 20], + [3, 17], + [1, 856], + [1, 718], + [1, 182], + [2, 10], + [1, 394], + [1, 444], + [2, 14], + [1, 490], + [3, 4], + [3, 8], + [1, 460], + [3, 19], + [1, 769], + [1, 504], + [1, 266], + [1, 675], + [1, 888], + [1, 699], + [1, 891], + [2, 8], + [3, 7], + [2, 6], + [1, 75], + [1, 330], + [2, 16], + [1, 392], + [3, 16], + [1, 409], + [1, 515], + [3, 16], + [1, 125], + [1, 370], + [3, 13], + [2, 6], + [2, 11], + [1, 818], + [2, 2], + [1, 105], + [2, 7], + [2, 5], + [1, 944], + [2, 19], + [2, 15], + [2, 12], + [2, 2], + [2, 20], + [2, 18], + [3, 1], + [2, 11], + [3, 1], + [1, 848], + [1, 717], + [2, 6], + [2, 14], + [2, 18], + [1, 774], + [2, 6], + [1, 654], + [2, 2], + [2, 12], + [1, 361], + [3, 18], + [3, 2], + [1, 433], + [1, 316], + [1, 264], + [1, 250], + [3, 17], + [3, 20], + [2, 16], + [1, 93], + [3, 4], + [1, 26], + [3, 7], + [2, 7], + [3, 8], + [1, 499], + [1, 817], + [3, 20], + [3, 9], + [1, 797], + [1, 708], + [2, 17], + [3, 14], + [3, 13], + [1, 26], + [3, 7], + [2, 18], + [2, 11], + [2, 20], + [1, 882], + [3, 11], + [1, 78], + [1, 135], + [3, 15], + [2, 5], + [2, 18], + [2, 4], + [2, 1], + [1, 118], + [1, 332], + [3, 13], + [2, 13], + [2, 9], + [3, 11], + [3, 19], + [2, 16], + [2, 1], + [3, 15], + [1, 568], + [1, 501], + [1, 823], + [2, 15], + [3, 17], + [3, 17], + [2, 19], + [3, 15], + [3, 3], + [1, 309], + [2, 17], + [2, 15], + [2, 10], + [2, 8], + [1, 24], + [3, 4], + [2, 14], + [3, 8], + [3, 1], + [3, 10], + [2, 8], + [3, 18], + [2, 1], + [2, 12], + [2, 10], + [1, 621], + [1, 974], + [1, 181], + [2, 17], + [2, 15], + [2, 7], + [3, 4], + [1, 415], + [2, 10], + [3, 10], + [3, 4], + [3, 18], + [1, 480], + [3, 10], + [2, 12], + [2, 8], + [2, 6], + [1, 86], + [3, 17], + [3, 13], + [1, 109], + [1, 300], + [1, 319], + [1, 228], + [3, 1], + [2, 8], + [3, 7], + [3, 10], + [3, 8], + [1, 38], + [2, 12], + [3, 20], + [2, 4], + [3, 12], + [2, 16], + [1, 278], + [2, 10], + [2, 11], + [1, 44], + [2, 19], + [1, 472], + [1, 939], + [1, 616], + [2, 12], + [3, 8], + [3, 20], + [3, 11], + [1, 574], + [3, 5], + [1, 68], + [1, 438], + [2, 6], + [1, 719], + [2, 16], + [3, 13], + [1, 739], + [3, 3], + [2, 20], + [3, 1], + [3, 2], + [2, 9], + [2, 12], + [3, 2], + [3, 12], + [2, 15], + [2, 9], + [1, 769], + [1, 164], + [1, 552], + [2, 5], + [2, 15], + [2, 15], + [3, 3], + [2, 2], + [1, 678], + [3, 11], + [2, 1], + [2, 9], + [2, 4], + [2, 18], + [2, 16], + [2, 1], + [1, 143], + [3, 14], + [3, 9], + [3, 15], + [1, 645], + [3, 11], + [2, 6], + [3, 17], + [3, 13], + [1, 595], + [3, 20], + [2, 6], + [1, 86], + [2, 14], + [1, 714], + [2, 7], + [2, 9], + [2, 5], + [1, 371], + [1, 55], + [1, 992], + [3, 13], + [3, 9], + [1, 669], + [3, 15], + [2, 9], + [2, 17], + [1, 578], + [1, 918], + [1, 624], + [3, 11], + [2, 20], + [1, 178], + [3, 19], + [1, 787], + [1, 174], + [3, 1], + [3, 12], + [2, 10], + [3, 5], + [3, 18], + [1, 949], + [2, 10], + [3, 4], + [2, 14], + [3, 16], + [1, 490], + [3, 14], + [2, 12], + [2, 12], + [1, 321], + [2, 3], + [2, 4], + [2, 9], + [3, 12], + [2, 11], + [1, 289], + [3, 8], + [3, 8], + [2, 7], + [3, 12], + [3, 10], + [3, 18], + [2, 1], + [3, 8], + [1, 404], + [2, 14], + [2, 1], + [3, 8], + [1, 115], + [2, 5], + [2, 5], + [1, 415], + [2, 7], + [1, 840], + [2, 20], + [1, 122], + [3, 9], + [3, 13], + [3, 13], + [2, 12], + [1, 25], + [1, 208], + [3, 8], + [2, 13], + [3, 19], + [3, 18], + [2, 2], + [2, 18], + [2, 5], + [3, 8], + [3, 9], + [1, 667], + [3, 5], + [2, 1], + [3, 6], + [3, 1], + [3, 6], + [3, 6], + [3, 8], + [2, 20], + [2, 11], + [1, 964], + [2, 6], + [3, 17], + [3, 4], + [2, 5], + [1, 430], + [3, 4], + [2, 10], + [3, 14], + [1, 376], + [2, 14], + [1, 981], + [1, 655], + [1, 699], + [1, 719], + [1, 532], + [3, 20], + [3, 17], + [3, 8], + [1, 899], + [3, 17], + [1, 954], + [3, 15], + [1, 898], + [2, 20], + [1, 295], + [2, 3], + [1, 885], + [3, 14], + [3, 15], + [2, 7], + [2, 10], + [1, 892], + [3, 15], + [1, 525], + [3, 9], + [3, 4], + [1, 8], + [1, 118], + [1, 838], + [1, 735], + [3, 3], + [1, 170], + [2, 9], + [1, 981], + [2, 9], + [3, 12], + [3, 12], + [3, 17], + [3, 20], + [3, 10], + [2, 13], + [3, 5], + [1, 997], + [3, 2], + [1, 336], + [1, 643], + [1, 57], + [2, 13], + [3, 9], + [1, 303], + [2, 19], + [1, 418], + [2, 14], + [1, 886], + [2, 2], + [2, 2], + [1, 301], + [2, 1], + [3, 11], + [1, 138], + [3, 16], + [3, 14], + [3, 20], + [2, 16], + [3, 6], + [1, 548], + [2, 20], + [1, 458], + [3, 4], + [1, 311], + [1, 559], + [3, 8], + [3, 15], + [1, 555], + [2, 10], + [2, 11], + [2, 18], + [3, 18], + [3, 3], + [2, 18], + [3, 20], + [1, 333], + [3, 15], + [2, 13], + [1, 218], + [2, 8], + [3, 15], + [3, 19], + [3, 8], + [3, 5], + [1, 8], + [3, 15], + [2, 10], + [3, 7], + [2, 3], + [3, 16], + [1, 566], + [1, 522], + [1, 205], + [1, 481], + [1, 832], + [1, 763], + [3, 9], + [1, 6], + [3, 10], + [2, 10], + [2, 8], + [1, 219], + [2, 7], + [3, 2], + [3, 16], + [2, 6], + [3, 15], + [3, 10], + [1, 558], + [2, 4], + [1, 137], + [1, 732], + [1, 74], + [1, 96], + [3, 9], + [1, 434], + [1, 91], + [3, 18], + [2, 20], + [2, 13], + [3, 5], + [3, 18], + [2, 6], + [3, 9], + [3, 18], + [3, 17], + [3, 12], + [1, 686], + [2, 14], + [3, 13], + [3, 7], + [3, 2], + [1, 991], + [2, 13], + [2, 3], + [3, 6], + [1, 678], + [3, 9], + [2, 7], + [1, 588], + [1, 633], + [3, 15], + [2, 11], + [2, 18], + [1, 570], + [2, 19], + [3, 11], + [1, 12], + [2, 9], + [1, 591], + [1, 576], + [1, 93], + [3, 20], + [3, 1], + [1, 82], + [1, 457], + [1, 577], + [2, 5], + [1, 495], + [2, 11], + [1, 309], + [1, 821], + [2, 12], + [1, 299], + [2, 14], + [2, 6], + [2, 16], + [3, 3], + [1, 567], + [1, 442], + [1, 210], + [2, 19], + [1, 916], + [2, 1], + [1, 256], + [2, 17], + [2, 11], + [3, 19], + [3, 9], + [3, 19], + [1, 689], + [1, 424], + [2, 4], + [1, 648], + [1, 85], + [3, 17], + [1, 456], + [2, 1], + [1, 873], + [2, 10], + [1, 863], + [2, 1], + [3, 11], + [2, 6], + [3, 19], + [1, 716], + [3, 4], + [1, 934], + [1, 338], + [1, 910], + [2, 7], + [2, 8], + [3, 20], + [3, 2], + [1, 780], + [3, 7], + [1, 830], + [3, 2], + [1, 165], + [3, 18], + [1, 741], + [2, 13], + [1, 102], + [2, 16], + [2, 12], + [2, 18], + [2, 12], + [1, 308], + [3, 10], + [3, 4], + [2, 9], + [1, 413], + [1, 384], + [1, 379], + [2, 10], + [3, 14], + [3, 14], + [3, 13], + [2, 19], + [1, 784], + [1, 222], + [3, 5], + [3, 3], + [1, 681], + [2, 18], + [2, 2], + [1, 748], + [3, 7], + [1, 95], + [2, 12], + [2, 5], + [1, 835], + [3, 17], + [3, 18], + [3, 2], + [3, 20], + [1, 67], + [2, 13], + [3, 19], + [1, 616], + [1, 716], + [2, 8], + [1, 380], + [1, 451], + [3, 6], + [1, 350], + [1, 664], + [3, 12], + [3, 2], + [2, 14], + [1, 195], + [3, 16], + [2, 18], + [1, 229], + [1, 916], + [1, 955], + [2, 10], + [3, 3], + [3, 14], + [2, 16], + [1, 927], + [2, 18], + [1, 323], + [2, 3], + [1, 607], + [3, 4], + [1, 714], + [3, 13], + [1, 17], + [3, 13], + [3, 20], + [1, 84], + [1, 280], + [2, 20], + [2, 15], + [1, 597], + [2, 1], + [1, 550], + [1, 8], + [1, 734], + [3, 4], + [2, 14], + [1, 969], + [2, 13], + [3, 2], + [3, 5], + [2, 20], + [1, 823], + [3, 19], + [3, 13], + [3, 19], + [3, 17], + [1, 242], + [3, 13], + [2, 11], + [2, 20], + [3, 16], + [2, 5], + [1, 872], + [1, 152], + [2, 17], + [2, 3], + [3, 8], + [1, 256], + [3, 2], + [2, 14], + [1, 204], + [1, 954], + [2, 15], + [3, 4], + [2, 8], + [2, 10], + [2, 9], + [3, 16], + [1, 943], + [1, 251], + [2, 12], + [3, 2], + [2, 5], + [1, 143], + [2, 6], + [2, 15], + [2, 19], + [3, 7], + [2, 7], + [3, 10], + [2, 6], + [2, 3], + [3, 14], + [3, 9], + [3, 6], + [1, 502], + [1, 91], + [2, 5], + [1, 109], + [3, 5], + [1, 418], + [3, 12], + [1, 278], + [3, 13], + [3, 15], + [2, 5], + [2, 2], + [1, 344], + [3, 13], + [2, 16], + [1, 946], + [1, 864], + [3, 17], + [3, 2], + [3, 6], + [1, 842], + [1, 809], + [2, 17], + [1, 1000], + [3, 15], + [2, 6], + [2, 5], + [2, 9], + [1, 91], + [2, 5], + [2, 7], + [3, 4], + [3, 16], + [1, 331], + [1, 52], + [3, 20], + [2, 1], + [3, 15], + [2, 9], + [2, 5], + [3, 2], + [1, 946], + [1, 826], + [3, 17], + [3, 18], + [1, 54], + [1, 934], + [1, 133], + [3, 2], + [3, 15], + [1, 491], + [3, 4], + [2, 3], + [3, 19], + [1, 875], + [1, 990], + [1, 84], + [3, 12], + [1, 370], + [3, 6], + [2, 16], + [2, 16], + [2, 1], + [2, 11], + [3, 19], + [2, 4], + [1, 842], + [2, 19], + [3, 18], + [2, 11], + [1, 783], + [2, 11], + [3, 8], + [1, 960], + [3, 7], + [2, 5], + [1, 365], + [3, 20], + [3, 9], + [1, 47], + [1, 807], + [1, 11], + [2, 2], + [2, 1], + [3, 9], + [2, 16], + [3, 10], + [2, 4], + [2, 7], + [3, 12], + [1, 841], + [1, 843], + [1, 439], + [3, 1], + [2, 5], + [1, 877], + [1, 884], + [3, 19], + [3, 7], + [1, 174], + [2, 9], + [3, 1], + [3, 4], + [2, 8], + [1, 213], + [3, 11], + [1, 152], + [3, 17], + [2, 2], + [2, 12], + [3, 3], + [2, 8], + [2, 3], + [1, 544], + [3, 9], + [3, 11], + [1, 692], + [1, 810], + [1, 527], + [3, 18], + [3, 1], + [1, 367], + [3, 12], + [2, 20], + [3, 8], + [2, 17], + [3, 8], + [1, 263], + [1, 475], + [2, 7], + [3, 16], + [3, 15], + [2, 19], + [3, 12], + [1, 642], + [2, 11], + [2, 14], + [2, 5], + [1, 320], + [3, 15], + [1, 168], + [2, 14], + [3, 15], + [2, 2], + [3, 10], + [2, 15], + [1, 765], + [3, 1], + [2, 4], + [1, 291], + [3, 18], + [3, 17], + [2, 17], + [3, 2], + [1, 248], + [2, 16], + [1, 810], + [3, 15], + [1, 299], + [2, 16], + [1, 333], + [3, 6], + [2, 2], + [2, 12], + [2, 17], + [3, 3], + [1, 254], + [3, 10], + [2, 19], + [2, 5], + [3, 17], + [2, 18], + [1, 219], + [2, 11], + [1, 20], + [3, 8], + [2, 5], + [2, 4], + [1, 640], + [1, 680], + [3, 14], + [3, 17], + [3, 16], + [3, 2], + [3, 10], + [3, 3], + [2, 18], + [3, 19], + [2, 10], + [3, 8], + [2, 14], + [3, 2], + [2, 13], + [1, 55], + [2, 13], + [1, 482], + [1, 209], + [3, 19], + [1, 571], + [3, 19], + [2, 3], + [1, 599], + [2, 17], + [3, 13], + [2, 9], + [2, 8], + [2, 20], + [3, 5], + [1, 831], + [2, 19], + [1, 625], + [2, 4], + [2, 8], + [1, 620], + [2, 17], + [2, 9], + [1, 215], + [1, 454], + [2, 8], + [3, 4], + [1, 221], + [1, 533], + [3, 5], + [3, 6], + [2, 20], + [2, 10], + [1, 907], + [3, 20], + [2, 20], + [1, 829], + [2, 19], + [1, 514], + [2, 8], + [1, 387], + [3, 7], + [1, 868], + [3, 14], + [2, 18], + [1, 813], + [2, 4], + [1, 449], + [2, 17], + [3, 19], + [3, 8], + [3, 8], + [2, 15], + [1, 56], + [3, 2], + [2, 1], + [3, 15], + [3, 17], + [3, 13], + [1, 228], + [2, 14], + [3, 18], + [2, 19], + [2, 15], + [3, 4], + [2, 18], + [3, 14], + [1, 745], + [1, 728], + [1, 727], + [3, 12], + [1, 114], + [3, 13], + [1, 39], + [3, 19], + [2, 11], + [1, 203], + [1, 514], + [3, 11], + [1, 639], + [1, 384], + [2, 18], + [3, 19], + [3, 11], + [1, 173], + [3, 12], + [3, 11], + [3, 8], + [2, 9], + [2, 15], + [3, 7], + [2, 2], + [1, 493], + [2, 5], + [3, 16], + [1, 408], + [3, 14], + [3, 1], + [2, 12], + [3, 2], + [3, 7], + [2, 15], + [1, 527], + [1, 792], + [2, 6], + [3, 6], + [2, 14], + [3, 8], + [2, 11], + [1, 524], + [1, 259], + [3, 15], + [1, 641], + [3, 17], + [3, 5], + [1, 165], + [3, 8], + [3, 7], + [1, 384], + [3, 8], + [1, 701], + [3, 10], + [2, 1], + [3, 13], + [2, 6], + [2, 16], + [3, 13], + [2, 20], + [1, 376], + [2, 16], + [2, 13], + [2, 15], + [3, 11], + [2, 19], + [2, 6], + [2, 16], + [2, 16], + [3, 11], + [2, 15], + [1, 487], + [2, 14], + [2, 13], + [1, 161], + [2, 6], + [3, 1], + [1, 777], + [3, 10], + [3, 1], + [3, 15], + [3, 14], + [3, 8], + [1, 695], + [3, 15], + [1, 229], + [3, 20], + [1, 653], + [3, 16], + [3, 4], + [3, 4], + [2, 4], + [1, 999], + [1, 376], + [3, 10], + [2, 9], + [2, 6], + [1, 967], + [3, 16], + [3, 2], + [1, 877], + [1, 843], + [1, 180], + [2, 10], + [1, 915], + [2, 12], + [1, 87], + [1, 996], + [3, 8], + [3, 16], + [3, 16], + [2, 2], + [3, 1], + [1, 855], + [3, 8], + [2, 8], + [2, 15], + [3, 19], + [3, 20], + [2, 11], + [3, 2], + [2, 15], + [3, 6], + [3, 1], + [3, 10], + [3, 15], + [2, 1], + [1, 515], + [1, 121], + [2, 9], + [2, 8], + [1, 997], + [3, 11], + [3, 7], + [1, 658], + [3, 17], + [2, 18], + [1, 744], + [1, 604], + [1, 897], + [2, 11], + [1, 59], + [3, 10], + [1, 124], + [2, 6], + [2, 10], + [1, 983], + [3, 20], + [1, 668], + [3, 14], + [1, 562], + [1, 310], + [3, 8], + [1, 227], + [1, 302], + [2, 17], + [1, 381], + [3, 2], + [1, 723], + [1, 853], + [1, 922], + [3, 3], + [2, 1], + [1, 912], + [3, 1], + [2, 18], + [1, 521], + [1, 99], + [3, 13], + [2, 4], + [1, 347], + [1, 76], + [3, 15], + [1, 57], + [3, 19], + [1, 800], + [2, 6], + [3, 1], + [1, 851], + [1, 645], + [3, 14], + [3, 13], + [1, 954], + [2, 13], + [3, 11], + [2, 15], + [2, 1], + [1, 724], + [2, 9], + [2, 15], + [1, 576], + [3, 2], + [2, 17], + [3, 17], + [3, 6], + [1, 98], + [2, 6], + [2, 6], + [1, 548], + [2, 19], + [1, 209], + [2, 14], + [3, 6], + [3, 3], + [2, 2], + [3, 4], + [1, 542], + [1, 279], + [2, 16], + [1, 745], + [2, 4], + [3, 1], + [1, 157], + [1, 877], + [1, 633], + [1, 147], + [3, 4], + [3, 5], + [2, 2], + [1, 864], + [2, 19], + [3, 18], + [2, 5], + [3, 16], + [3, 6], + [2, 10], + [3, 5], + [2, 11], + [3, 15], + [1, 572], + [1, 201], + [3, 16], + [2, 5], + [1, 566], + [3, 18], + [1, 119], + [1, 481], + [1, 12], + [3, 17], + [3, 8], + [3, 16], + [1, 320], + [3, 8], + [3, 4], + [1, 549], + [3, 12], + [1, 762], + [2, 4], + [1, 736], + [3, 4], + [2, 19], + [2, 15], + [3, 13], + [1, 115], + [2, 2], + [3, 18], + [3, 5], + [2, 6], + [1, 320], + [2, 11], + [3, 17], + [2, 1], + [3, 18], + [2, 13], + [3, 18], + [3, 16], + [1, 43], + [3, 19], + [2, 19], + [3, 20], + [3, 6], + [2, 6], + [1, 111], + [2, 6], + [1, 589], + [3, 11], + [3, 9], + [3, 10], + [1, 394], + [3, 5], + [2, 5], + [3, 4], + [2, 11], + [1, 817], + [1, 459], + [1, 112], + [1, 874], + [3, 15], + [3, 9], + [2, 14], + [2, 17], + [3, 17], + [1, 66], + [2, 15], + [2, 1], + [1, 503], + [3, 2], + [2, 4], + [3, 1], + [1, 180], + [2, 15], + [1, 619], + [2, 5], + [3, 5], + [2, 4], + [3, 5], + [2, 8], + [2, 12], + [2, 14], + [2, 1], + [1, 208], + [2, 19], + [1, 77], + [1, 510], + [2, 7], + [2, 15], + [1, 973], + [3, 1], + [1, 541], + [1, 621], + [2, 6], + [1, 557], + [3, 17], + [3, 11], + [2, 11], + [3, 10], + [3, 13], + [2, 4], + [2, 13], + [2, 6], + [2, 3], + [2, 7], + [2, 4], + [1, 659], + [1, 623], + [2, 19], + [2, 3], + [3, 10], + [3, 10], + [3, 9], + [2, 3], + [2, 10], + [1, 79], + [3, 19], + [2, 19], + [1, 725], + [2, 5], + [3, 12], + [1, 597], + [3, 5], + [1, 392], + [3, 2], + [1, 401], + [1, 121], + [2, 12], + [1, 64], + [3, 10], + [1, 777], + [2, 7], + [3, 14], + [3, 2], + [1, 842], + [1, 660], + [3, 17], + [2, 12], + [2, 14], + [2, 15], + [3, 15], + [2, 4], + [1, 524], + [1, 555], + [3, 18], + [3, 5], + [2, 13], + [3, 8], + [1, 964], + [3, 9], + [2, 12], + [1, 735], + [3, 6], + [2, 16], + [2, 18], + [3, 7], + [2, 8], + [2, 10], + [2, 11], + [3, 3], + [3, 19], + [2, 7], + [2, 10], + [2, 12], + [3, 20], + [3, 3], + [2, 3], + [3, 16], + [1, 754], + [1, 137], + [1, 770], + [2, 20], + [2, 12], + [2, 5], + [2, 14], + [2, 9], + [2, 10], + [3, 18], + [1, 728], + [3, 5], + [1, 307], + [3, 19], + [1, 211], + [3, 4], + [2, 6], + [2, 8], + [1, 282], + [1, 905], + [1, 638], + [2, 12], + [1, 928], + [3, 8], + [2, 10], + [2, 9], + [2, 12], + [2, 9], + [1, 891], + [3, 6], + [1, 376], + [2, 16], + [1, 654], + [2, 17], + [3, 16], + [2, 5], + [3, 2], + [1, 21], + [3, 5], + [1, 303], + [2, 19], + [3, 12], + [2, 19], + [2, 17], + [3, 2], + [2, 9], + [2, 20], + [1, 167], + [1, 28], + [3, 1], + [2, 4], + [1, 665], + [2, 5], + [3, 11], + [1, 485], + [3, 14], + [1, 339], + [2, 8], + [2, 15], + [2, 1], + [2, 13], + [2, 2], + [3, 16], + [2, 7], + [3, 19], + [3, 3], + [1, 703], + [3, 12], + [1, 4], + [3, 20], + [1, 314], + [2, 14], + [3, 11], + [2, 12], + [1, 250], + [1, 165], + [1, 432], + [1, 489], + [1, 683], + [1, 459], + [3, 1], + [3, 6], + [2, 16], + [1, 625], + [2, 16], + [2, 12], + [1, 871], + [3, 6], + [1, 459], + [2, 17], + [1, 78], + [2, 11], + [1, 538], + [1, 6], + [1, 737], + [3, 16], + [3, 20], + [1, 792], + [3, 7], + [3, 3], + [1, 251], + [1, 732], + [3, 16], + [2, 13], + [3, 15], + [3, 5], + [2, 17], + [3, 18], + [1, 405], + [3, 20], + [2, 17], + [1, 118], + [1, 145], + [3, 12], + [1, 94], + [2, 13], + [3, 3], + [3, 4], + [2, 10], + [3, 13], + [1, 832], + [3, 20], + [3, 3], + [2, 10], + [3, 5], + [3, 12], + [2, 17], + [3, 4], + [2, 3], + [2, 16], + [3, 19], + [3, 13], + [3, 19], + [3, 14], + [2, 17], + [3, 6], + [3, 11], + [1, 814], + [1, 763], + [1, 907], + [1, 205], + [2, 19], + [1, 24], + [2, 9], + [1, 422], + [2, 10], + [3, 13], + [3, 16], + [1, 433], + [2, 15], + [1, 988], + [3, 5], + [2, 14], + [3, 11], + [2, 6], + [2, 10], + [3, 14], + [3, 14], + [2, 5], + [2, 8], + [3, 9], + [2, 3], + [2, 12], + [3, 8], + [1, 649], + [1, 728], + [3, 5], + [3, 11], + [2, 1], + [3, 7], + [1, 409], + [3, 5], + [2, 6], + [1, 785], + [1, 446], + [3, 19], + [1, 254], + [1, 450], + [1, 435], + [1, 686], + [1, 256], + [1, 422], + [3, 2], + [3, 9], + [3, 4], + [1, 639], + [1, 510], + [3, 9], + [2, 13], + [3, 15], + [2, 16], + [2, 13], + [1, 69], + [1, 167], + [1, 352], + [1, 69], + [1, 895], + [3, 16], + [2, 11], + [2, 7], + [3, 3], + [3, 20], + [2, 4], + [2, 20], + [1, 764], + [2, 1], + [2, 18], + [2, 17], + [1, 130], + [2, 4], + [2, 14], + [1, 738], + [3, 6], + [3, 8], + [3, 6], + [3, 1], + [3, 18], + [1, 188], + [2, 10], + [2, 10], + [1, 194], + [3, 17], + [3, 15], + [1, 262], + [1, 504], + [1, 566], + [3, 3], + [2, 10], + [1, 662], + [2, 13], + [1, 888], + [2, 16], + [1, 232], + [3, 11], + [3, 15], + [2, 7], + [2, 3], + [2, 12], + [3, 3], + [2, 13], + [3, 16], + [3, 9], + [2, 10], + [2, 13], + [2, 16], + [2, 7], + [1, 445], + [2, 13], + [1, 534], + [1, 886], + [1, 975], + [1, 727], + [1, 223], + [3, 9], + [2, 1], + [2, 18], + [3, 6], + [2, 3], + [3, 19], + [2, 7], + [3, 7], + [3, 18], + [3, 2], + [2, 19], + [3, 9], + [3, 8], + [1, 205], + [2, 11], + [2, 12], + [2, 20], + [1, 275], + [2, 19], + [1, 688], + [1, 296], + [1, 523], + [2, 15], + [2, 15], + [2, 7], + [3, 19], + [3, 20], + [3, 5], + [3, 5], + [1, 959], + [1, 779], + [1, 905], + [3, 11], + [2, 8], + [1, 11], + [2, 5], + [1, 386], + [2, 9], + [3, 11], + [1, 803], + [2, 3], + [1, 861], + [2, 3], + [2, 10], + [2, 6], + [1, 686], + [1, 541], + [3, 17], + [1, 312], + [2, 11], + [3, 16], + [1, 960], + [3, 13], + [2, 2], + [1, 306], + [3, 20], + [3, 12], + [1, 185], + [2, 16], + [3, 17], + [2, 15], + [2, 14], + [3, 1], + [1, 145], + [3, 1], + [1, 263], + [2, 1], + [1, 938], + [3, 12], + [2, 12], + [3, 12], + [3, 14], + [2, 12], + [1, 435], + [2, 15], + [2, 9], + [1, 472], + [2, 8], + [1, 137], + [2, 15], + [1, 518], + [2, 12], + [1, 94], + [1, 211], + [1, 753], + [2, 19], + [1, 222], + [3, 5], + [2, 16], + [2, 17], + [3, 13], + [3, 2], + [1, 782], + [3, 5], + [1, 279], + [1, 982], + [1, 248], + [3, 19], + [2, 19], + [2, 11], + [2, 10], + [1, 362], + [1, 244], + [1, 354], + [2, 8], + [2, 10], + [3, 14], + [3, 19], + [1, 749], + [3, 11], + [1, 754], + [2, 7], + [2, 14], + [2, 19], + [3, 9], + [3, 7], + [3, 10], + [3, 2], + [2, 3], + [2, 17], + [2, 10], + [2, 7], + [2, 18], + [3, 11], + [3, 11], + [3, 16], + [3, 4], + [3, 10], + [3, 15], + [2, 14], + [1, 300], + [1, 416], + [3, 15], + [2, 15], + [2, 1], + [1, 83], + [1, 945], + [1, 275], + [3, 13], + [1, 693], + [1, 565], + [2, 6], + [1, 311], + [3, 18], + [1, 357], + [3, 19], + [2, 16], + [1, 306], + [3, 12], + [2, 10], + [3, 2], + [1, 81], + [1, 696], + [1, 559], + [1, 403], + [3, 19], + [3, 7], + [3, 6], + [3, 8], + [2, 13], + [2, 19], + [1, 368], + [3, 8], + [2, 6], + [3, 2], + [1, 189], + [3, 8], + [3, 18], + [3, 3], + [3, 20], + [2, 11], + [1, 379], + [2, 18], + [3, 1], + [3, 16], + [3, 14], + [2, 12], + [3, 4], + [1, 871], + [1, 295], + [1, 393], + [3, 12], + [2, 16], + [1, 441], + [1, 322], + [2, 10], + [2, 11], + [1, 528], + [3, 8], + [1, 618], + [3, 12], + [1, 818], + [2, 17], + [3, 20], + [3, 3], + [2, 11], + [2, 20], + [2, 10], + [3, 8], + [1, 954], + [3, 2], + [1, 110], + [1, 332], + [1, 291], + [3, 3], + [3, 19], + [1, 504], + [2, 6], + [2, 14], + [1, 726], + [3, 20], + [3, 19], + [1, 489], + [1, 447], + [2, 19], + [2, 10], + [1, 577], + [3, 1], + [3, 10], + [3, 4], + [1, 610], + [2, 1], + [1, 933], + [3, 7], + [2, 12], + [3, 16], + [2, 9], + [3, 11], + [3, 17], + [1, 756], + [3, 16], + [2, 18], + [2, 18], + [1, 299], + [3, 20], + [2, 20], + [1, 78], + [1, 275], + [3, 17], + [1, 631], + [2, 20], + [2, 16], + [3, 9], + [1, 488], + [1, 535], + [2, 19], + [2, 18], + [1, 111], + [2, 19], + [1, 339], + [1, 226], + [2, 1], + [2, 11], + [1, 158], + [2, 7], + [1, 83], + [3, 5], + [1, 167], + [3, 5], + [2, 2], + [1, 922], + [3, 1], + [1, 651], + [2, 11], + [3, 19], + [1, 71], + [3, 10], + [2, 8], + [2, 5], + [3, 18], + [2, 11], + [1, 345], + [2, 14], + [2, 11], + [1, 184], + [3, 8], + [1, 722], + [3, 13], + [1, 830], + [2, 12], + [3, 11], + [1, 407], + [2, 12], + [3, 14], + [2, 16], + [1, 270], + [3, 16], + [1, 741], + [1, 436], + [1, 612], + [1, 614], + [1, 710], + [1, 324], + [1, 264], + [3, 20], + [2, 15], + [2, 6], + [3, 2], + [3, 14], + [1, 31], + [2, 19], + [1, 844], + [2, 7], + [1, 212], + [2, 7], + [3, 10], + [3, 11], + [3, 8], + [3, 3], + [1, 112], + [2, 19], + [2, 5], + [2, 18], + [3, 11], + [2, 18], + [3, 14], + [3, 20], + [3, 5], + [2, 6], + [1, 408], + [3, 9], + [2, 19], + [2, 17], + [3, 12], + [3, 2], + [1, 316], + [2, 18], + [3, 20], + [1, 597], + [1, 312], + [3, 10], + [2, 8], + [2, 7], + [2, 8], + [3, 11], + [1, 53], + [3, 9], + [3, 2], + [3, 12], + [2, 11], + [1, 933], + [2, 11], + [1, 168], + [2, 3], + [2, 13], + [3, 5], + [3, 8], + [2, 4], + [3, 2], + [1, 113], + [2, 11], + [2, 10], + [3, 11], + [3, 7], + [2, 13], + [2, 4], + [1, 183], + [1, 403], + [2, 3], + [1, 131], + [1, 714], + [3, 4], + [3, 18], + [3, 12], + [1, 163], + [3, 9], + [1, 625], + [1, 972], + [3, 2], + [1, 296], + [2, 14], + [1, 806], + [1, 318], + [1, 41], + [3, 8], + [2, 2], + [1, 258], + [3, 15], + [1, 386], + [3, 19], + [3, 7], + [3, 8], + [1, 700], + [2, 9], + [3, 15], + [3, 12], + [1, 265], + [3, 9], + [3, 14], + [3, 19], + [2, 11], + [2, 19], + [2, 3], + [2, 1], + [2, 11], + [3, 17], + [2, 9], + [2, 7], + [1, 808], + [1, 402], + [3, 14], + [3, 2], + [2, 7], + [3, 4], + [3, 14], + [2, 15], + [3, 5], + [1, 331], + [1, 9], + [3, 10], + [3, 1], + [1, 668], + [2, 18], + [1, 420], + [2, 8], + [2, 4], + [1, 984], + [2, 12], + [3, 4], + [3, 9], + [2, 11], + [1, 774], + [2, 8], + [1, 925], + [3, 14], + [3, 10], + [1, 761], + [1, 834], + [2, 16], + [2, 1], + [1, 235], + [3, 1], + [2, 2], + [3, 14], + [2, 4], + [2, 7], + [1, 960], + [1, 809], + [2, 18], + [2, 20], + [1, 130], + [3, 18], + [2, 7], + [1, 939], + [3, 18], + [1, 915], + [2, 14], + [3, 13], + [1, 458], + [1, 857], + [1, 781], + [2, 8], + [2, 11], + [2, 8], + [3, 4], + [1, 936], + [3, 9], + [1, 745], + [1, 122], + [2, 16], + [3, 17], + [3, 8], + [1, 477], + [1, 618], + [3, 1], + [1, 52], + [3, 4], + [2, 20], + [2, 12], + [3, 13], + [3, 20], + [3, 2], + [2, 11], + [3, 18], + [3, 12], + [1, 280], + [3, 4], + [2, 6], + [2, 4], + [3, 2], + [3, 2], + [2, 4], + [3, 1], + [2, 4], + [1, 4], + [2, 5], + [3, 12], + [1, 992], + [3, 1], + [1, 333], + [3, 8], + [2, 17], + [1, 40], + [1, 616], + [2, 6], + [1, 541], + [1, 667], + [3, 1], + [2, 12], + [3, 19], + [2, 14], + [1, 483], + [3, 12], + [3, 16], + [1, 601], + [3, 3], + [1, 727], + [1, 984], + [1, 288], + [2, 2], + [1, 177], + [1, 582], + [3, 5], + [3, 18], + [3, 17], + [2, 8], + [2, 14], + [2, 8], + [2, 12], + [2, 14], + [3, 20], + [2, 11], + [3, 2], + [1, 792], + [3, 6], + [3, 19], + [1, 684], + [1, 552], + [2, 11], + [2, 15], + [1, 430], + [1, 936], + [3, 18], + [3, 1], + [3, 11], + [1, 470], + [2, 16], + [3, 9], + [2, 13], + [1, 195], + [2, 2], + [3, 10], + [1, 128], + [2, 7], + [3, 19], + [3, 5], + [3, 6], + [2, 12], + [2, 4], + [3, 17], + [1, 17], + [2, 16], + [1, 679], + [1, 10], + [2, 7], + [1, 564], + [1, 968], + [2, 10], + [2, 16], + [3, 18], + [1, 16], + [3, 17], + [3, 14], + [3, 5], + [3, 10], + [3, 16], + [1, 354], + [2, 17], + [1, 17], + [2, 19], + [3, 11], + [3, 18], + [2, 20], + [1, 479], + [1, 156], + [2, 18], + [3, 15], + [2, 14], + [1, 921], + [3, 18], + [2, 10], + [1, 937], + [1, 373], + [3, 1], + [3, 18], + [2, 11], + [1, 84], + [3, 5], + [1, 300], + [3, 11], + [3, 14], + [1, 668], + [2, 8], + [3, 19], + [1, 552], + [2, 9], + [3, 7], + [2, 6], + [2, 5], + [3, 15], + [3, 16], + [1, 907], + [2, 4], + [2, 15], + [2, 5], + [3, 20], + [1, 752], + [2, 11], + [1, 613], + [2, 12], + [2, 9], + [3, 14], + [2, 20], + [2, 13], + [3, 14], + [2, 17], + [3, 4], + [3, 18], + [2, 13], + [1, 815], + [3, 20], + [2, 18], + [1, 834], + [2, 19], + [1, 457], + [1, 386], + [2, 7], + [1, 95], + [2, 3], + [3, 3], + [1, 749], + [3, 18], + [1, 270], + [3, 12], + [2, 4], + [3, 6], + [3, 3], + [3, 15], + [2, 17], + [1, 915], + [1, 738], + [3, 17], + [2, 1], + [3, 9], + [1, 169], + [1, 46], + [2, 5], + [1, 684], + [1, 103], + [1, 177], + [1, 851], + [3, 15], + [2, 14], + [1, 684], + [2, 13], + [3, 2], + [2, 9], + [3, 12], + [2, 16], + [2, 3], + [2, 14], + [2, 16], + [2, 12], + [1, 315], + [3, 8], + [3, 15], + [3, 13], + [3, 10], + [3, 9], + [1, 581], + [1, 597], + [3, 18], + [1, 257], + [2, 9], + [1, 286], + [1, 777], + [2, 14], + [3, 2], + [2, 1], + [2, 9], + [3, 18], + [2, 11], + [2, 3], + [2, 4], + [3, 14], + [1, 755], + [2, 17], + [1, 415], + [3, 6], + [3, 13], + [3, 17], + [3, 12], + [3, 20], + [1, 949], + [3, 18], + [3, 7], + [1, 383], + [3, 10], + [2, 9], + [3, 4], + [3, 10], + [2, 17], + [1, 473], + [1, 658], + [2, 5], + [2, 19], + [1, 787], + [3, 18], + [1, 700], + [2, 19], + [3, 6], + [3, 10], + [1, 261], + [1, 688], + [2, 5], + [3, 14], + [1, 795], + [3, 1], + [1, 20], + [2, 20], + [1, 25], + [1, 849], + [1, 363], + [3, 5], + [2, 9], + [1, 161], + [3, 3], + [3, 3], + [3, 10], + [1, 163], + [1, 766], + [3, 12], + [3, 19], + [2, 11], + [3, 1], + [1, 295], + [3, 9], + [1, 827], + [2, 13], + [3, 20], + [2, 5], + [1, 690], + [3, 1], + [3, 5], + [1, 730], + [1, 165], + [3, 11], + [2, 4], + [1, 898], + [1, 662], + [3, 15], + [1, 922], + [2, 10], + [1, 118], + [1, 198], + [1, 658], + [1, 278], + [3, 1], + [3, 1], + [3, 19], + [1, 915], + [3, 18], + [2, 2], + [1, 634], + [1, 248], + [1, 683], + [2, 20], + [3, 8], + [1, 861], + [3, 12], + [3, 8], + [3, 6], + [3, 14], + [3, 8], + [3, 2], + [1, 283], + [1, 785], + [2, 12], + [3, 18], + [2, 2], + [2, 14], + [3, 12], + [3, 15], + [1, 135], + [3, 1], + [2, 13], + [2, 13], + [1, 658], + [2, 5], + [1, 685], + [1, 269], + [3, 19], + [2, 2], + [3, 2], + [1, 804], + [2, 10], + [1, 944], + [3, 4], + [3, 9], + [2, 17], + [3, 7], + [3, 8], + [1, 442], + [3, 20], + [3, 16], + [1, 115], + [3, 14], + [1, 992], + [2, 7], + [3, 11], + [2, 5], + [1, 352], + [3, 3], + [3, 19], + [2, 18], + [3, 15], + [2, 11], + [3, 10], + [3, 13], + [3, 15], + [1, 314], + [3, 13], + [3, 6], + [3, 8], + [2, 14], + [1, 9], + [2, 9], + [2, 10], + [1, 92], + [2, 17], + [1, 926], + [1, 39], + [2, 5], + [2, 19], + [3, 10], + [2, 12], + [2, 13], + [1, 24], + [2, 15], + [1, 911], + [3, 14], + [2, 19], + [2, 14], + [3, 8], + [1, 977], + [1, 452], + [2, 3], + [3, 8], + [1, 433], + [3, 7], + [2, 14], + [2, 19], + [3, 11], + [2, 11], + [1, 106], + [3, 4], + [3, 20], + [2, 6], + [2, 5], + [3, 11], + [1, 242], + [3, 2], + [1, 541], + [3, 18], + [1, 900], + [1, 431], + [2, 9], + [3, 5], + [1, 454], + [3, 15], + [1, 347], + [1, 119], + [2, 13], + [2, 1], + [1, 339], + [3, 10], + [1, 764], + [1, 141], + [2, 9], + [2, 16], + [1, 239], + [1, 254], + [3, 14], + [3, 9], + [3, 5], + [1, 751], + [2, 4], + [2, 4], + [3, 16], + [2, 1], + [3, 6], + [1, 750], + [1, 122], + [3, 7], + [1, 767], + [1, 374], + [1, 189], + [2, 8], + [1, 458], + [2, 14], + [2, 2], + [2, 4], + [3, 12], + [3, 15], + [1, 116], + [1, 450], + [3, 16], + [1, 231], + [1, 942], + [2, 4], + [2, 7], + [1, 532], + [2, 17], + [2, 12], + [2, 20], + [2, 13], + [3, 3], + [1, 116], + [1, 696], + [3, 10], + [2, 16], + [1, 914], + [1, 79], + [2, 9], + [1, 672], + [2, 6], + [1, 902], + [2, 20], + [3, 5], + [1, 359], + [3, 5], + [2, 6], + [3, 15], + [3, 8], + [3, 12], + [1, 982], + [2, 18], + [3, 7], + [2, 13], + [2, 11], + [1, 210], + [2, 11], + [1, 943], + [3, 19], + [1, 62], + [3, 14], + [1, 571], + [1, 236], + [3, 9], + [2, 19], + [1, 566], + [2, 16], + [3, 12], + [1, 996], + [1, 425], + [1, 555], + [2, 13], + [1, 326], + [2, 14], + [3, 17], + [3, 17], + [2, 10], + [1, 215], + [2, 3], + [3, 17], + [1, 986], + [3, 4], + [1, 106], + [3, 13], + [3, 8], + [3, 17], + [1, 334], + [1, 438], + [1, 811], + [3, 12], + [2, 20], + [3, 4], + [1, 495], + [2, 7], + [1, 25], + [1, 113], + [3, 4], + [2, 12], + [3, 16], + [1, 1000], + [2, 8], + [3, 10], + [3, 12], + [1, 374], + [2, 15], + [3, 9], + [1, 762], + [2, 4], + [2, 3], + [3, 4], + [1, 920], + [2, 20], + [3, 19], + [2, 6], + [2, 12], + [3, 7], + [1, 894], + [2, 18], + [1, 136], + [3, 16], + [2, 1], + [2, 7], + [2, 11], + [3, 15], + [2, 14], + [2, 15], + [3, 19], + [1, 77], + [1, 239], + [3, 14], + [2, 16], + [1, 286], + [3, 15], + [2, 20], + [1, 11], + [3, 9], + [2, 20], + [2, 12], + [2, 4], + [3, 14], + [1, 787], + [3, 16], + [2, 13], + [1, 38], + [1, 733], + [3, 17], + [3, 16], + [2, 6], + [1, 514], + [3, 11], + [1, 681], + [3, 14], + [3, 10], + [1, 271], + [2, 9], + [1, 283], + [2, 18], + [2, 7], + [1, 711], + [1, 476], + [2, 13], + [3, 19], + [1, 113], + [2, 7], + [2, 18], + [2, 4], + [2, 8], + [3, 17], + [3, 7], + [3, 11], + [3, 10], + [3, 6], + [2, 18], + [2, 2], + [1, 423], + [2, 10], + [1, 598], + [3, 10], + [1, 475], + [2, 3], + [1, 732], + [2, 7], + [1, 257], + [3, 1], + [2, 10], + [3, 17], + [1, 223], + [2, 7], + [2, 3], + [1, 934], + [2, 14], + [3, 7], + [1, 424], + [2, 6], + [3, 6], + [3, 1], + [3, 1], + [1, 933], + [1, 609], + [2, 20], + [2, 15], + [1, 918], + [2, 5], + [3, 5], + [2, 11], + [2, 19], + [3, 14], + [3, 1], + [3, 8], + [1, 841], + [1, 475], + [3, 19], + [2, 7], + [2, 11], + [3, 20], + [1, 476], + [1, 907], + [3, 14], + [2, 14], + [3, 2], + [1, 579], + [3, 7], + [3, 20], + [3, 2], + [2, 5], + [2, 5], + [3, 2], + [1, 177], + [1, 209], + [3, 2], + [3, 16], + [2, 16], + [1, 411], + [1, 320], + [1, 420], + [2, 2], + [1, 858], + [1, 433], + [2, 14], + [3, 17], + [1, 273], + [2, 8], + [3, 16], + [3, 12], + [1, 691], + [2, 7], + [1, 799], + [2, 17], + [1, 400], + [3, 13], + [2, 10], + [1, 979], + [3, 11], + [1, 510], + [1, 980], + [1, 127], + [1, 434], + [1, 514], + [2, 4], + [2, 15], + [3, 15], + [2, 11], + [3, 10], + [1, 66], + [3, 11], + [1, 21], + [3, 19], + [3, 20], + [2, 5], + [2, 4], + [2, 9], + [3, 10], + [1, 631], + [1, 736], + [3, 1], + [2, 1], + [3, 2], + [3, 19], + [1, 270], + [3, 1], + [2, 3], + [2, 11], + [2, 11], + [1, 274], + [3, 20], + [2, 11], + [2, 20], + [3, 6], + [2, 16], + [3, 3], + [1, 100], + [3, 10], + [2, 14], + [1, 701], + [1, 487], + [2, 16], + [3, 1], + [1, 25], + [1, 887], + [2, 17], + [2, 8], + [1, 235], + [1, 306], + [1, 31], + [2, 2], + [1, 706], + [2, 3], + [2, 3], + [1, 257], + [3, 4], + [2, 4], + [3, 19], + [1, 135], + [3, 6], + [1, 72], + [3, 14], + [3, 8], + [1, 472], + [1, 911], + [1, 643], + [1, 526], + [2, 10], + [1, 65], + [3, 11], + [3, 2], + [1, 551], + [1, 938], + [3, 14], + [3, 8], + [2, 17], + [1, 11], + [2, 7], + [2, 3], + [2, 16], + [2, 9], + [2, 5], + [3, 14], + [1, 412], + [3, 7], + [1, 630], + [3, 7], + [1, 2], + [1, 428], + [3, 1], + [2, 8], + [1, 852], + [1, 27], + [1, 555], + [2, 15], + [1, 937], + [2, 10], + [3, 20], + [2, 19], + [1, 614], + [3, 3], + [2, 12], + [2, 4], + [3, 12], + [2, 6], + [1, 443], + [2, 8], + [2, 8], + [3, 10], + [2, 11], + [2, 3], + [1, 830], + [3, 15], + [1, 248], + [2, 13], + [2, 1], + [1, 877], + [1, 680], + [3, 15], + [1, 657], + [2, 20], + [2, 14], + [3, 8], + [2, 18], + [2, 8], + [1, 182], + [3, 15], + [2, 17], + [1, 733], + [1, 865], + [2, 2], + [3, 7], + [1, 576], + [3, 18], + [3, 19], + [2, 13], + [2, 20], + [2, 6], + [2, 20], + [1, 81], + [3, 16], + [3, 15], + [2, 11], + [3, 2], + [3, 2], + [3, 3], + [2, 15], + [2, 11], + [2, 2], + [1, 949], + [2, 7], + [1, 434], + [1, 882], + [2, 6], + [3, 3], + [2, 1], + [3, 19], + [2, 9], + [1, 110], + [1, 463], + [3, 13], + [3, 11], + [2, 10], + [3, 1], + [1, 628], + [1, 300], + [2, 13], + [2, 20], + [3, 5], + [1, 525], + [2, 20], + [3, 13], + [3, 19], + [3, 2], + [2, 14], + [3, 12], + [1, 137], + [1, 440], + [1, 162], + [3, 10], + [2, 20], + [3, 20], + [1, 103], + [3, 1], + [1, 345], + [3, 18], + [1, 694], + [1, 723], + [1, 146], + [3, 3], + [3, 18], + [3, 19], + [2, 5], + [1, 427], + [1, 411], + [2, 13], + [1, 726], + [3, 15], + [1, 832], + [2, 2], + [3, 19], + [3, 3], + [2, 14], + [2, 9], + [1, 485], + [1, 940], + [1, 41], + [2, 13], + [1, 731], + [3, 14], + [1, 642], + [3, 11], + [2, 14], + [2, 5], + [2, 3], + [3, 10], + [1, 614], + [1, 136], + [2, 13], + [1, 759], + [1, 290], + [1, 10], + [1, 749], + [3, 15], + [1, 788], + [1, 159], + [3, 19], + [2, 5], + [3, 14], + [3, 2], + [1, 106], + [3, 4], + [3, 4], + [3, 12], + [1, 153], + [3, 20], + [1, 943], + [3, 5], + [1, 992], + [2, 13], + [3, 10], + [2, 14], + [2, 15], + [2, 15], + [3, 10], + [1, 938], + [1, 605], + [1, 343], + [2, 5], + [3, 9], + [2, 1], + [3, 15], + [3, 10], + [2, 2], + [3, 1], + [1, 577], + [1, 360], + [2, 19], + [3, 13], + [1, 825], + [1, 400], + [3, 18], + [1, 769], + [1, 935], + [3, 1], + [2, 13], + [1, 307], + [3, 3], + [2, 9], + [1, 298], + [2, 8], + [1, 618], + [3, 3], + [1, 714], + [2, 13], + [3, 4], + [1, 651], + [1, 429], + [3, 6], + [1, 76], + [3, 17], + [1, 159], + [3, 2], + [1, 646], + [1, 360], + [3, 2], + [1, 574], + [1, 71], + [1, 532], + [1, 366], + [2, 16], + [3, 3], + [2, 15], + [2, 16], + [3, 17], + [1, 516], + [2, 8], + [2, 3], + [2, 10], + [3, 8], + [2, 13], + [3, 9], + [1, 777], + [3, 7], + [3, 3], + [3, 1], + [2, 11], + [1, 645], + [3, 9], + [3, 8], + [2, 12], + [1, 885], + [3, 18], + [2, 13], + [2, 2], + [1, 449], + [1, 326], + [3, 15], + [1, 520], + [3, 17], + [2, 20], + [3, 7], + [2, 11], + [3, 7], + [2, 2], + [2, 8], + [1, 302], + [3, 1], + [3, 2], + [3, 3], + [3, 8], + [3, 6], + [2, 12], + [1, 4], + [3, 13], + [1, 934], + [1, 605], + [2, 3], + [3, 10], + [1, 985], + [1, 662], + [1, 2], + [2, 10], + [2, 20], + [3, 14], + [3, 11], + [2, 8], + [1, 892], + [2, 18], + [1, 719], + [1, 100], + [3, 9], + [1, 485], + [3, 11], + [3, 15], + [2, 18], + [1, 298], + [2, 16], + [3, 18], + [2, 11], + [1, 531], + [3, 17], + [2, 9], + [1, 822], + [1, 621], + [1, 601], + [2, 7], + [1, 577], + [2, 15], + [1, 36], + [2, 1], + [3, 16], + [2, 17], + [3, 2], + [2, 7], + [1, 603], + [3, 5], + [3, 15], + [2, 14], + [2, 2], + [3, 5], + [3, 5], + [2, 10], + [1, 850], + [2, 15], + [3, 5], + [3, 7], + [1, 184], + [1, 852], + [3, 17], + [2, 15], + [2, 2], + [2, 13], + [3, 15], + [2, 15], + [3, 5], + [3, 15], + [1, 661], + [3, 13], + [2, 1], + [2, 9], + [2, 6], + [2, 8], + [3, 17], + [2, 7], + [3, 15], + [2, 11], + [2, 11], + [3, 1], + [1, 236], + [3, 4], + [3, 5], + [1, 181], + [2, 14], + [1, 146], + [2, 15], + [1, 950], + [1, 965], + [2, 19], + [2, 13], + [1, 821], + [1, 665], + [2, 7], + [3, 5], + [1, 119], + [3, 1], + [2, 2], + [1, 525], + [1, 454], + [1, 814], + [3, 5], + [1, 854], + [3, 19], + [1, 804], + [3, 2], + [2, 6], + [1, 738], + [2, 13], + [3, 8], + [1, 670], + [3, 8], + [3, 12], + [1, 615], + [1, 800], + [2, 17], + [1, 112], + [2, 15], + [3, 6], + [2, 16], + [2, 5], + [2, 10], + [2, 8], + [3, 1], + [3, 8], + [1, 893], + [1, 899], + [1, 961], + [3, 14], + [1, 775], + [2, 14], + [2, 7], + [3, 11], + [2, 19], + [1, 598], + [2, 14], + [3, 20], + [3, 15], + [2, 12], + [1, 644], + [2, 14], + [3, 13], + [1, 264], + [2, 5], + [3, 7], + [1, 63], + [1, 621], + [2, 19], + [1, 929], + [1, 398], + [3, 6], + [3, 5], + [2, 20], + [3, 14], + [2, 5], + [3, 7], + [1, 946], + [2, 15], + [3, 7], + [1, 631], + [3, 9], + [2, 12], + [3, 9], + [3, 19], + [1, 542], + [3, 6], + [1, 185], + [3, 2], + [3, 20], + [3, 8], + [1, 797], + [2, 14], + [2, 20], + [3, 20], + [2, 10], + [2, 19], + [3, 3], + [3, 3], + [1, 817], + [1, 403], + [3, 12], + [3, 14], + [3, 8], + [2, 11], + [3, 7], + [3, 12], + [2, 10], + [2, 12], + [1, 699], + [1, 676], + [3, 2], + [1, 547], + [3, 20], + [2, 3], + [2, 18], + [1, 141], + [2, 8], + [2, 2], + [3, 14], + [2, 20], + [2, 1], + [1, 91], + [1, 125], + [1, 360], + [3, 10], + [3, 6], + [3, 18], + [1, 624], + [2, 8], + [3, 6], + [1, 27], + [2, 12], + [1, 940], + [2, 6], + [1, 2], + [3, 6], + [1, 97], + [3, 3], + [2, 10], + [2, 15], + [1, 251], + [1, 243], + [1, 694], + [1, 850], + [2, 5], + [2, 3], + [1, 342], + [2, 13], + [1, 256], + [1, 636], + [3, 4], + [3, 16], + [2, 6], + [3, 8], + [2, 15], + [2, 7], + [3, 5], + [1, 953], + [2, 3], + [1, 693], + [1, 270], + [1, 581], + [3, 4], + [1, 209], + [2, 6], + [1, 377], + [1, 175], + [3, 14], + [1, 952], + [3, 16], + [2, 1], + [1, 202], + [1, 58], + [3, 6], + [2, 11], + [1, 383], + [1, 928], + [3, 4], + [2, 7], + [3, 3], + [1, 379], + [1, 702], + [3, 10], + [3, 16], + [2, 1], + [1, 484], + [1, 35], + [1, 365], + [2, 8], + [1, 237], + [3, 17], + [2, 18], + [1, 169], + [2, 12], + [3, 18], + [3, 14], + [3, 1], + [3, 4], + [3, 19], + [3, 12], + [3, 19], + [2, 19], + [2, 13], + [1, 369], + [2, 16], + [3, 15], + [1, 103], + [3, 3], + [2, 18], + [3, 9], + [2, 17], + [3, 9], + [3, 10], + [3, 6], + [2, 16], + [2, 10], + [3, 2], + [1, 30], + [3, 6], + [2, 1], + [2, 18], + [3, 15], + [3, 10], + [3, 6], + [2, 6], + [3, 8], + [2, 11], + [3, 18], + [1, 463], + [2, 10], + [2, 9], + [3, 2], + [3, 20], + [3, 13], + [1, 142], + [2, 16], + [3, 7], + [2, 4], + [2, 10], + [3, 17], + [1, 212], + [1, 887], + [2, 17], + [2, 13], + [3, 4], + [2, 12], + [3, 14], + [1, 5], + [3, 14], + [3, 11], + [2, 6], + [1, 231], + [2, 5], + [2, 7], + [3, 17], + [2, 11], + [2, 14], + [2, 19], + [1, 48], + [2, 17], + [3, 8], + [3, 9], + [2, 10], + [3, 8], + [3, 1], + [3, 11], + [2, 15], + [3, 20], + [2, 14], + [3, 4], + [2, 8], + [3, 17], + [3, 2], + [2, 4], + [1, 381], + [1, 26], + [3, 7], + [2, 6], + [1, 30], + [3, 20], + [1, 956], + [2, 7], + [3, 11], + [1, 721], + [1, 326], + [2, 19], + [3, 3], + [3, 19], + [3, 17], + [3, 2], + [1, 367], + [3, 17], + [2, 2], + [3, 8], + [2, 16], + [2, 3], + [1, 910], + [1, 270], + [3, 14], + [2, 15], + [1, 205], + [1, 853], + [1, 643], + [2, 7], + [3, 16], + [3, 15], + [2, 12], + [3, 14], + [1, 20], + [2, 13], + [2, 14], + [2, 8], + [1, 112], + [1, 176], + [3, 20], + [2, 17], + [3, 6], + [2, 2], + [2, 7], + [3, 14], + [2, 15], + [3, 6], + [2, 10], + [2, 17], + [1, 13], + [2, 17], + [1, 791], + [1, 275], + [2, 6], + [3, 16], + [2, 9], + [3, 3], + [2, 8], + [3, 4], + [1, 289], + [1, 935], + [3, 18], + [3, 20], + [1, 928], + [1, 510], + [2, 4], + [3, 13], + [3, 17], + [2, 15], + [1, 248], + [3, 16], + [1, 671], + [3, 5], + [3, 9], + [3, 10], + [3, 19], + [1, 655], + [3, 15], + [2, 20], + [3, 3], + [3, 19], + [3, 17], + [1, 773], + [3, 13], + [3, 14], + [3, 20], + [2, 14], + [2, 16], + [1, 527], + [2, 17], + [3, 4], + [3, 1], + [2, 14], + [2, 15], + [3, 9], + [2, 3], + [3, 19], + [2, 1], + [2, 11], + [2, 5], + [3, 1], + [3, 6], + [3, 8], + [1, 937], + [2, 6], + [2, 17], + [1, 215], + [3, 13], + [2, 3], + [2, 15], + [3, 15], + [2, 1], + [3, 3], + [1, 960], + [1, 934], + [3, 16], + [3, 19], + [3, 7], + [1, 372], + [2, 6], + [2, 3], + [1, 547], + [1, 698], + [3, 8], + [3, 14], + [1, 86], + [2, 11], + [2, 12], + [3, 19], + [2, 1], + [1, 628], + [1, 311], + [1, 859], + [1, 875], + [1, 247], + [3, 16], + [3, 3], + [2, 14], + [2, 8], + [2, 5], + [1, 160], + [2, 3], + [1, 866], + [3, 2], + [2, 14], + [2, 11], + [2, 17], + [3, 12], + [2, 9], + [3, 20], + [1, 649], + [3, 11], + [1, 179], + [2, 7], + [3, 10], + [3, 12], + [2, 12], + [2, 20], + [2, 15], + [2, 2], + [3, 13], + [3, 2], + [2, 4], + [1, 603], + [3, 9], + [2, 11], + [3, 18], + [3, 3], + [3, 4], + [3, 6], + [2, 8], + [1, 915], + [2, 20], + [3, 5], + [1, 636], + [1, 713], + [1, 907], + [1, 544], + [1, 476], + [2, 15], + [3, 16], + [1, 125], + [2, 17], + [2, 14], + [2, 11], + [2, 6], + [1, 945], + [1, 254], + [2, 6], + [3, 19], + [2, 16], + [2, 10], + [3, 12], + [2, 19], + [1, 452], + [2, 20], + [3, 1], + [3, 9], + [3, 3], + [1, 976], + [3, 6], + [1, 722], + [2, 10], + [2, 17], + [1, 478], + [3, 17], + [3, 1], + [1, 384], + [3, 1], + [3, 17], + [1, 678], + [1, 596], + [1, 53], + [3, 14], + [2, 9], + [3, 3], + [3, 19], + [2, 5], + [1, 776], + [1, 556], + [2, 3], + [3, 3], + [3, 17], + [1, 446], + [1, 694], + [3, 8], + [1, 206], + [1, 914], + [1, 669], + [3, 20], + [2, 2], + [3, 6], + [1, 813], + [1, 131], + [2, 15], + [1, 290], + [3, 8], + [2, 15], + [1, 673], + [1, 780], + [2, 3], + [2, 2], + [1, 727], + [2, 15], + [2, 15], + [2, 7], + [2, 17], + [1, 465], + [1, 271], + [2, 5], + [2, 13], + [1, 805], + [2, 19], + [1, 129], + [2, 10], + [2, 12], + [1, 689], + [2, 7], + [3, 18], + [2, 17], + [1, 546], + [2, 19], + [1, 754], + [2, 18], + [2, 1], + [1, 188], + [2, 19], + [3, 20], + [2, 15], + [1, 23], + [3, 11], + [2, 17], + [2, 4], + [1, 477], + [3, 4], + [1, 90], + [3, 3], + [3, 12], + [2, 7], + [3, 5], + [1, 308], + [3, 19], + [1, 929], + [3, 7], + [2, 19], + [3, 19], + [2, 18], + [3, 7], + [1, 337], + [2, 7], + [1, 155], + [3, 3], + [1, 177], + [2, 9], + [1, 592], + [3, 10], + [2, 8], + [1, 591], + [3, 1], + [2, 2], + [1, 965], + [2, 12], + [3, 11], + [2, 1], + [2, 20], + [3, 6], + [1, 482], + [1, 843], + [2, 17], + [2, 8], + [2, 7], + [1, 617], + [2, 18], + [2, 8], + [3, 3], + [1, 777], + [2, 18], + [2, 12], + [3, 3], + [1, 114], + [2, 19], + [3, 10], + [1, 348], + [3, 7], + [2, 18], + [1, 940], + [2, 16], + [1, 437], + [1, 882], + [2, 17], + [3, 11], + [2, 6], + [1, 1000], + [3, 13], + [2, 6], + [1, 339], + [3, 18], + [2, 20], + [2, 13], + [3, 6], + [3, 7], + [3, 12], + [3, 2], + [2, 5], + [3, 19], + [3, 16], + [2, 13], + [2, 16], + [3, 8], + [2, 7], + [2, 1], + [1, 438], + [1, 556], + [2, 9], + [3, 4], + [1, 545], + [1, 628], + [2, 12], + [2, 2], + [2, 1], + [1, 240], + [1, 292], + [1, 58], + [2, 19], + [1, 364], + [2, 4], + [3, 9], + [3, 13], + [1, 663], + [1, 462], + [2, 18], + [3, 1], + [2, 13], + [1, 12], + [3, 17], + [1, 763], + [2, 7], + [1, 849], + [3, 10], + [1, 406], + [3, 8], + [2, 10], + [2, 3], + [1, 583], + [1, 370], + [1, 219], + [1, 128], + [1, 349], + [3, 2], + [2, 1], + [3, 9], + [1, 561], + [3, 12], + [1, 267], + [3, 11], + [3, 7], + [2, 2], + [2, 19], + [3, 19], + [3, 16], + [3, 12], + [2, 8], + [2, 16], + [1, 204], + [1, 279], + [2, 5], + [2, 18], + [2, 18], + [3, 5], + [2, 19], + [3, 3], + [3, 12], + [1, 989], + [1, 258], + [1, 455], + [1, 710], + [2, 8], + [3, 14], + [2, 19], + [1, 149], + [2, 14], + [2, 7], + [2, 9], + [2, 17], + [2, 13], + [2, 19], + [2, 3], + [3, 14], + [1, 289], + [1, 733], + [3, 1], + [1, 181], + [3, 20], + [1, 69], + [2, 16], + [1, 279], + [3, 13], + [1, 406], + [2, 8], + [3, 17], + [3, 4], + [1, 350], + [3, 9], + [3, 12], + [2, 7], + [3, 15], + [3, 14], + [1, 434], + [2, 20], + [2, 12], + [2, 14], + [1, 265], + [3, 18], + [1, 642], + [3, 1], + [1, 323], + [3, 12], + [1, 75], + [1, 768], + [1, 493], + [3, 7], + [3, 9], + [1, 673], + [3, 6], + [2, 17], + [2, 20], + [3, 16], + [2, 9], + [3, 5], + [1, 723], + [1, 477], + [2, 9], + [2, 5], + [1, 257], + [1, 632], + [1, 383], + [3, 3], + [2, 5], + [1, 169], + [3, 2], + [3, 16], + [2, 2], + [1, 626], + [3, 6], + [3, 4], + [1, 738], + [3, 8], + [3, 7], + [1, 812], + [2, 15], + [3, 19], + [1, 618], + [1, 935], + [1, 463], + [3, 16], + [2, 11], + [3, 3], + [2, 11], + [3, 11], + [3, 7], + [3, 6], + [1, 540], + [2, 15], + [2, 2], + [1, 796], + [3, 7], + [2, 4], + [2, 19], + [2, 11], + [3, 12], + [2, 20], + [2, 7], + [2, 14], + [2, 18], + [1, 612], + [1, 809], + [2, 15], + [2, 11], + [3, 15], + [3, 7], + [3, 5], + [3, 6], + [1, 496], + [3, 20], + [3, 8], + [1, 271], + [3, 2], + [3, 10], + [1, 834], + [2, 5], + [3, 17], + [3, 11], + [1, 464], + [1, 231], + [3, 12], + [1, 259], + [1, 829], + [2, 15], + [2, 9], + [2, 20], + [2, 7], + [1, 249], + [1, 78], + [1, 652], + [2, 18], + [2, 1], + [2, 20], + [1, 644], + [1, 31], + [3, 6], + [2, 10], + [3, 7], + [2, 11], + [2, 18], + [1, 238], + [3, 19], + [3, 8], + [3, 12], + [3, 8], + [3, 13], + [2, 16], + [2, 16], + [1, 943], + [2, 19], + [2, 19], + [3, 14], + [1, 449], + [3, 7], + [2, 1], + [3, 18], + [1, 546], + [1, 739], + [1, 298], + [2, 15], + [1, 390], + [3, 15], + [1, 15], + [1, 849], + [1, 518], + [1, 397], + [1, 414], + [3, 20], + [2, 16], + [3, 17], + [2, 17], + [3, 13], + [2, 15], + [1, 696], + [2, 16], + [1, 694], + [1, 169], + [1, 331], + [2, 2], + [1, 463], + [1, 521], + [1, 260], + [1, 289], + [1, 970], + [1, 986], + [2, 9], + [1, 667], + [1, 532], + [3, 7], + [1, 964], + [1, 858], + [1, 568], + [1, 190], + [1, 873], + [1, 768], + [2, 7], + [2, 1], + [2, 13], + [1, 98], + [1, 536], + [2, 9], + [3, 6], + [3, 1], + [1, 755], + [3, 2], + [2, 16], + [2, 1], + [3, 2], + [3, 19], + [1, 162], + [1, 184], + [1, 199], + [2, 1], + [1, 472], + [1, 168], + [2, 6], + [3, 12], + [1, 186], + [1, 289], + [2, 18], + [3, 9], + [1, 147], + [3, 17], + [1, 690], + [2, 11], + [1, 424], + [2, 17], + [1, 343], + [3, 9], + [3, 6], + [2, 19], + [1, 717], + [2, 12], + [1, 271], + [2, 4], + [2, 5], + [3, 18], + [1, 624], + [2, 6], + [3, 16], + [2, 5], + [3, 9], + [3, 7], + [1, 557], + [1, 633], + [1, 366], + [3, 14], + [3, 4], + [2, 12], + [3, 3], + [2, 14], + [1, 52], + [1, 101], + [1, 290], + [1, 742], + [2, 11], + [2, 6], + [3, 10], + [1, 165], + [2, 14], + [3, 15], + [2, 3], + [2, 10], + [2, 18], + [2, 5], + [1, 265], + [1, 942], + [2, 3], + [1, 888], + [3, 19], + [1, 930], + [3, 4], + [2, 8], + [3, 16], + [1, 580], + [2, 20], + [1, 142], + [3, 14], + [1, 255], + [3, 5], + [1, 848], + [3, 8], + [3, 16], + [1, 300], + [1, 178], + [2, 9], + [1, 770], + [2, 3], + [2, 18], + [2, 6], + [3, 16], + [2, 5], + [3, 9], + [3, 17], + [3, 14], + [2, 5], + [1, 674], + [3, 16], + [1, 627], + [3, 1], + [3, 14], + [2, 9], + [2, 17], + [2, 13], + [3, 4], + [3, 8], + [1, 404], + [3, 17], + [3, 13], + [3, 19], + [2, 13], + [3, 20], + [2, 6], + [3, 9], + [2, 19], + [2, 15], + [2, 17], + [3, 20], + [2, 9], + [3, 7], + [1, 666], + [2, 16], + [1, 251], + [3, 6], + [1, 45], + [2, 4], + [2, 10], + [2, 18], + [2, 11], + [3, 9], + [2, 18], + [2, 17], + [2, 9], + [3, 6], + [3, 9], + [2, 4], + [3, 14], + [1, 465], + [1, 141], + [2, 6], + [3, 15], + [1, 713], + [2, 18], + [2, 12], + [1, 733], + [1, 116], + [1, 447], + [2, 2], + [3, 8], + [2, 7], + [1, 828], + [3, 5], + [1, 103], + [3, 10], + [3, 10], + [2, 7], + [1, 785], + [1, 251], + [1, 864], + [2, 16], + [2, 11], + [2, 13], + [3, 4], + [3, 11], + [2, 11], + [3, 4], + [1, 515], + [1, 844], + [1, 728], + [2, 7], + [1, 389], + [3, 14], + [2, 11], + [3, 6], + [2, 6], + [3, 4], + [3, 14], + [1, 372], + [1, 97], + [3, 13], + [2, 10], + [2, 4], + [2, 17], + [3, 12], + [1, 705], + [2, 18], + [2, 10], + [1, 489], + [3, 8], + [3, 13], + [3, 16], + [1, 211], + [2, 18], + [3, 19], + [1, 761], + [1, 908], + [2, 3], + [1, 627], + [2, 3], + [3, 2], + [1, 633], + [3, 11], + [1, 776], + [3, 4], + [2, 9], + [3, 1], + [3, 19], + [1, 154], + [3, 4], + [3, 15], + [3, 6], + [2, 13], + [2, 10], + [2, 2], + [1, 257], + [3, 6], + [1, 179], + [3, 6], + [1, 774], + [3, 18], + [3, 11], + [1, 802], + [2, 20], + [2, 8], + [3, 20], + [2, 1], + [2, 7], + [2, 14], + [1, 67], + [1, 909], + [3, 8], + [1, 52], + [3, 11], + [3, 3], + [1, 755], + [1, 191], + [2, 15], + [3, 5], + [2, 16], + [3, 18], + [3, 11], + [2, 1], + [1, 962], + [2, 20], + [3, 14], + [2, 18], + [2, 17], + [3, 12], + [3, 16], + [2, 10], + [1, 602], + [3, 6], + [3, 3], + [2, 1], + [1, 565], + [3, 15], + [1, 73], + [3, 11], + [2, 8], + [1, 492], + [1, 631], + [2, 15], + [2, 3], + [1, 733], + [2, 9], + [3, 9], + [2, 16], + [1, 463], + [2, 13], + [1, 971], + [3, 20], + [2, 3], + [3, 4], + [3, 14], + [1, 734], + [3, 17], + [3, 3], + [3, 10], + [1, 521], + [2, 18], + [2, 11], + [1, 122], + [2, 3], + [2, 14], + [3, 14], + [2, 7], + [1, 288], + [3, 7], + [2, 9], + [3, 7], + [1, 318], + [2, 11], + [1, 274], + [2, 12], + [1, 976], + [2, 2], + [2, 20], + [3, 3], + [3, 5], + [1, 472], + [3, 5], + [2, 16], + [3, 6], + [3, 8], + [3, 9], + [3, 11], + [3, 17], + [3, 4], + [3, 12], + [3, 17], + [2, 1], + [2, 2], + [3, 10], + [3, 16], + [3, 7], + [3, 3], + [2, 14], + [3, 6], + [2, 1], + [3, 3], + [1, 585], + [3, 10], + [3, 5], + [1, 858], + [3, 1], + [3, 12], + [1, 19], + [1, 60], + [2, 14], + [1, 995], + [2, 3], + [2, 19], + [3, 11], + [2, 8], + [2, 18], + [3, 11], + [2, 18], + [1, 486], + [2, 14], + [2, 9], + [3, 14], + [3, 7], + [3, 3], + [3, 3], + [2, 2], + [2, 1], + [2, 18], + [1, 315], + [2, 19], + [1, 310], + [1, 949], + [2, 3], + [1, 300], + [3, 14], + [1, 392], + [1, 500], + [2, 17], + [1, 410], + [1, 560], + [1, 131], + [2, 17], + [1, 442], + [2, 1], + [1, 187], + [2, 2], + [3, 10], + [1, 177], + [3, 19], + [3, 16], + [3, 3], + [1, 500], + [3, 9], + [3, 9], + [3, 14], + [3, 4], + [2, 10], + [2, 6], + [2, 13], + [3, 16], + [1, 604], + [3, 2], + [1, 85], + [3, 6], + [1, 281], + [3, 10], + [3, 9], + [1, 781], + [2, 6], + [1, 291], + [2, 12], + [2, 8], + [2, 7], + [2, 13], + [1, 928], + [1, 233], + [1, 866], + [2, 10], + [1, 761], + [1, 977], + [2, 5], + [3, 3], + [2, 16], + [2, 13], + [3, 3], + [3, 1], + [2, 8], + [3, 4], + [1, 566], + [1, 560], + [3, 20], + [2, 10], + [3, 2], + [3, 4], + [3, 7], + [1, 822], + [3, 5], + [2, 16], + [2, 14], + [1, 950], + [1, 126], + [1, 645], + [3, 18], + [2, 4], + [3, 10], + [1, 297], + [3, 16], + [3, 15], + [2, 6], + [3, 8], + [1, 971], + [1, 542], + [1, 51], + [3, 18], + [3, 7], + [1, 465], + [2, 10], + [1, 634], + [3, 9], + [3, 16], + [1, 194], + [2, 20], + [2, 17], + [1, 735], + [1, 175], + [2, 15], + [1, 908], + [3, 19], + [3, 2], + [3, 14], + [1, 840], + [1, 119], + [1, 210], + [1, 209], + [3, 2], + [1, 339], + [2, 18], + [2, 17], + [3, 6], + [3, 3], + [3, 5], + [2, 8], + [1, 277], + [1, 667], + [1, 158], + [3, 3], + [1, 483], + [3, 7], + [1, 656], + [1, 831], + [2, 14], + [1, 201], + [3, 10], + [1, 290], + [3, 15], + [2, 4], + [2, 17], + [3, 15], + [2, 14], + [3, 18], + [1, 408], + [3, 14], + [3, 17], + [1, 617], + [3, 2], + [3, 18], + [1, 308], + [2, 19], + [3, 7], + [1, 345], + [2, 14], + [2, 3], + [2, 12], + [2, 10], + [3, 1], + [3, 9], + [3, 4], + [3, 3], + [2, 8], + [3, 19], + [1, 546], + [2, 1], + [1, 760], + [1, 447], + [2, 3], + [3, 6], + [2, 3], + [2, 19], + [3, 12], + [3, 16], + [1, 696], + [1, 351], + [3, 1], + [3, 4], + [1, 320], + [1, 955], + [1, 754], + [2, 7], + [2, 13], + [3, 20], + [3, 3], + [1, 78], + [1, 214], + [3, 14], + [1, 959], + [1, 94], + [2, 15], + [3, 14], + [3, 8], + [2, 14], + [2, 13], + [1, 353], + [1, 186], + [2, 4], + [1, 800], + [3, 8], + [2, 1], + [3, 2], + [1, 6], + [2, 5], + [3, 9], + [2, 14], + [2, 15], + [3, 10], + [2, 9], + [3, 14], + [3, 4], + [3, 2], + [2, 12], + [2, 8], + [2, 13], + [1, 194], + [3, 18], + [3, 18], + [3, 20], + [1, 916], + [3, 11], + [3, 6], + [3, 10], + [2, 11], + [2, 11], + [2, 14], + [3, 15], + [2, 16], + [3, 9], + [3, 14], + [1, 304], + [2, 1], + [3, 7], + [2, 1], + [1, 345], + [3, 8], + [3, 6], + [2, 20], + [3, 17], + [2, 15], + [2, 5], + [3, 20], + [1, 788], + [3, 9], + [1, 899], + [3, 13], + [1, 934], + [1, 856], + [2, 10], + [1, 153], + [1, 124], + [1, 953], + [3, 10], + [1, 605], + [1, 183], + [1, 680], + [2, 18], + [3, 17], + [3, 8], + [3, 18], + [1, 203], + [1, 591], + [2, 18], + [3, 1], + [3, 3], + [3, 15], + [3, 8], + [3, 9], + [1, 786], + [2, 4], + [2, 15], + [3, 10], + [1, 215], + [3, 14], + [2, 18], + [2, 14], + [3, 6], + [3, 4], + [3, 1], + [2, 16], + [1, 776], + [2, 4], + [3, 8], + [3, 18], + [2, 8], + [3, 2], + [2, 9], + [2, 17], + [3, 18], + [1, 56], + [2, 6], + [3, 12], + [2, 18], + [3, 16], + [1, 733], + [1, 953], + [2, 10], + [3, 20], + [1, 973], + [1, 775], + [2, 16], + [3, 7], + [3, 16], + [2, 10], + [3, 12], + [2, 14], + [1, 135], + [3, 18], + [3, 9], + [2, 16], + [2, 13], + [3, 4], + [3, 11], + [2, 12], + [3, 13], + [2, 19], + [2, 13], + [2, 14], + [3, 7], + [1, 542], + [1, 781], + [1, 213], + [1, 314], + [2, 19], + [2, 8], + [2, 18], + [1, 83] + ], + "expected": [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1] + } +] From 7a26637319f3c2307662c861a0d10c73fa116f37 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Fri, 11 Apr 2025 13:08:10 -0400 Subject: [PATCH 4/5] [Hacker Rank] Interview Preparation Kit: Dictionaries and Hashmaps: Frequency Queries. Coverage increased. --- .../FrequencyQueries.java | 3 +- .../FrequencyQueriesTest.java | 50 ++++++++++++++++++- ...ueries.testcase_border_case_exception.json | 9 ++++ ...equency_queries.testcase_border_cases.json | 19 +++++++ 4 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase_border_case_exception.json create mode 100644 algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase_border_cases.json diff --git a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java index f58bd55..0dda1cd 100644 --- a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java +++ b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java @@ -96,7 +96,8 @@ static List freqQuery(List> queries) { result.add(freqMap.containsKey(value) ? __FOUND__ : __NOT_FOUND__); break; default: - break; + throw new IllegalArgumentException( + "Operation %d not supported".formatted(operation)); } } diff --git a/algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java b/algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java index e6b3053..c51cb68 100644 --- a/algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java +++ b/algorithm-exercises-java/src/test/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueriesTest.java @@ -1,6 +1,8 @@ package ae.hackerrank.interview_preparation_kit.dictionaries_and_hashmaps; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; import java.util.List; @@ -21,9 +23,11 @@ public static class FrequencyQueriesTestCase { List testCases; List testCase6; + List testCaseBorderCases; + List testCaseBorderCaseException; @BeforeAll - public void setup() throws IOException { + void setup() throws IOException { String path; path = String.join("/", "hackerrank", @@ -39,6 +43,20 @@ public void setup() throws IOException { "dictionaries_and_hashmaps", "frequency_queries.testcase6.json"); this.testCase6 = JsonLoader.loadJson(path, FrequencyQueriesTestCase.class); + + path = String.join("/", + "hackerrank", + "interview_preparation_kit", + "dictionaries_and_hashmaps", + "frequency_queries.testcase_border_cases.json"); + this.testCaseBorderCases = JsonLoader.loadJson(path, FrequencyQueriesTestCase.class); + + path = String.join("/", + "hackerrank", + "interview_preparation_kit", + "dictionaries_and_hashmaps", + "frequency_queries.testcase_border_case_exception.json"); + this.testCaseBorderCaseException = JsonLoader.loadJson(path, FrequencyQueriesTestCase.class); } @Test @@ -71,4 +89,34 @@ void testFrequencyQueriesBigCases() { test.expected)); } } + + @Test + void testFrequencyQueriesBorderCases() { + List solutionFound; + + for (FrequencyQueriesTestCase test : testCaseBorderCases) { + + solutionFound = FrequencyQueries.freqQuery(test.input); + + assertEquals(test.expected, solutionFound, + "%s(%s) answer must be: %s".formatted( + "FrequencyQueriesTest.freqQuery", + test.input, + test.expected)); + } + } + + @Test + void testFrequencyQueriesBorderCaseException() { + for (FrequencyQueriesTestCase test : testCaseBorderCaseException) { + Exception exception = assertThrows(IllegalArgumentException.class, () -> { + FrequencyQueries.freqQuery(test.input); + }); + + String expectedMessage = "Operation 4 not supported"; + String actualMessage = exception.getMessage(); + + assertTrue(actualMessage.contains(expectedMessage)); + } + } } diff --git a/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase_border_case_exception.json b/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase_border_case_exception.json new file mode 100644 index 0000000..7e988e3 --- /dev/null +++ b/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase_border_case_exception.json @@ -0,0 +1,9 @@ +[ + { + "title": "Test Case Border Case when operation doesn't exists", + "input": [ + [4, 1] + ], + "expected": [] + } +] diff --git a/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase_border_cases.json b/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase_border_cases.json new file mode 100644 index 0000000..d499f58 --- /dev/null +++ b/algorithm-exercises-java/src/test/resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.testcase_border_cases.json @@ -0,0 +1,19 @@ +[ + { + "title": "Test Case Border Case when decrease in frequency already exists", + "input": [ + [1, 1], + [1, 1], + [1, 1], + [2, 1], + [1, 2], + [1, 2], + [1, 2], + [2, 2], + [3, 1], + [3, 2], + [3, 3] + ], + "expected": [0, 1, 0] + } +] From 315cbcd4dbf63cca0d460cdcd0d5e5294065c80e Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Fri, 11 Apr 2025 13:45:06 -0400 Subject: [PATCH 5/5] [Hacker Rank] Interview Preparation Kit: Dictionaries and Hashmaps: Frequency Queries. Try to reduce complexity using OOP. --- .../FrequencyQueries.java | 124 ++++++++++-------- 1 file changed, 70 insertions(+), 54 deletions(-) diff --git a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java index 0dda1cd..9d6ba06 100644 --- a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java +++ b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java @@ -24,76 +24,92 @@ private FrequencyQueries() { private static final int __NOT_FOUND__ = 0; private static final int __FOUND__ = 1; + Map valueFreqs = new HashMap<>(); + Map> freqMap = new HashMap<>(); + List result = new ArrayList<>(); + + void insert(Long value) { + Long currentFreqCount = this.valueFreqs.getOrDefault(value, null); + Long newFreqCount; + List newFreq; + + newFreqCount = (currentFreqCount == null ? __INITIAL__ : currentFreqCount + 1L); + valueFreqs.put(value, newFreqCount); + + newFreq = freqMap.getOrDefault(newFreqCount, null); + + // delete current frequency + if (currentFreqCount != null) { + freqMap.get(currentFreqCount).remove(value); + if (freqMap.get(currentFreqCount).isEmpty()) { + freqMap.remove(currentFreqCount); + } + } + + // add new frequency + if (newFreq == null) { + newFreq = new ArrayList<>(); + newFreq.add(value); + freqMap.put(newFreqCount, newFreq); + } else { + freqMap.get(newFreqCount).add(value); + } + } + + void delete(Long value) { + Long currentFreqCount = this.valueFreqs.getOrDefault(value, null); + Long newFreqCount; + List newFreq; + + newFreqCount = (currentFreqCount == null ? 0 : currentFreqCount - 1L); + if (newFreqCount > 0L) { + valueFreqs.put(value, newFreqCount); + + newFreq = freqMap.getOrDefault(newFreqCount, null); + // add new frequency + if (newFreq == null) { + newFreq = new ArrayList<>(); + newFreq.add(value); + freqMap.put(newFreqCount, newFreq); + } else { + freqMap.get(newFreqCount).add(value); + } + } else { + valueFreqs.remove(value); + } + + // delete current frequency + if (currentFreqCount != null) { + freqMap.get(currentFreqCount).remove(value); + if (freqMap.get(currentFreqCount).isEmpty()) { + freqMap.remove(currentFreqCount); + } + } + } + /** * FrequencyQueries. */ static List freqQuery(List> queries) { - List result = new ArrayList<>(); - Map valueFreqs = new HashMap<>(); - Map> freqMap = new HashMap<>(); + + FrequencyQueries fq = new FrequencyQueries(); + fq.result = new ArrayList<>(); for (List query : queries) { int operation = query.get(0); long value = query.get(1); - Long currentFreqCount = valueFreqs.getOrDefault(value, null); - Long newFreqCount; - List newFreq; - switch (operation) { case __INSERT__: - newFreqCount = (currentFreqCount == null ? __INITIAL__ : currentFreqCount + 1L); - valueFreqs.put(value, newFreqCount); - - newFreq = freqMap.getOrDefault(newFreqCount, null); - - // delete current frequency - if (currentFreqCount != null) { - freqMap.get(currentFreqCount).remove(value); - if (freqMap.get(currentFreqCount).isEmpty()) { - freqMap.remove(currentFreqCount); - } - } - - // add new frequency - if (newFreq == null) { - newFreq = new ArrayList<>(); - newFreq.add(value); - freqMap.put(newFreqCount, newFreq); - } else { - freqMap.get(newFreqCount).add(value); - } + fq.insert(value); break; case __DELETE__: - newFreqCount = (currentFreqCount == null ? 0 : currentFreqCount - 1L); - if (newFreqCount > 0L) { - valueFreqs.put(value, newFreqCount); - - newFreq = freqMap.getOrDefault(newFreqCount, null); - // add new frequency - if (newFreq == null) { - newFreq = new ArrayList<>(); - newFreq.add(value); - freqMap.put(newFreqCount, newFreq); - } else { - freqMap.get(newFreqCount).add(value); - } - } else { - valueFreqs.remove(value); - } - - // delete current frequency - if (currentFreqCount != null) { - freqMap.get(currentFreqCount).remove(value); - if (freqMap.get(currentFreqCount).isEmpty()) { - freqMap.remove(currentFreqCount); - } - } + fq.delete(value); break; case __SELECT__: - result.add(freqMap.containsKey(value) ? __FOUND__ : __NOT_FOUND__); + fq.result.add(fq.freqMap.containsKey(value) ? __FOUND__ : __NOT_FOUND__); break; default: throw new IllegalArgumentException( @@ -101,6 +117,6 @@ static List freqQuery(List> queries) { } } - return result; + return fq.result; } }