Advertisement
shikhorroy

SRBD E: Building a Research and Development Center

Aug 17th, 2022
780
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.87 KB | None | 0 0
  1. import java.io.OutputStream;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.io.PrintWriter;
  6. import java.io.BufferedWriter;
  7. import java.util.InputMismatchException;
  8. import java.io.IOException;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. import java.io.Writer;
  12. import java.io.OutputStreamWriter;
  13. import java.io.InputStream;
  14.  
  15. /**
  16.  * Built using CHelper plug-in
  17.  * Actual solution is at the top
  18.  *
  19.  * @author Roy
  20.  */
  21. public class Main {
  22.     public static void main(String[] args) {
  23.         InputStream inputStream = System.in;
  24.         OutputStream outputStream = System.out;
  25.         InputReader in = new InputReader(inputStream);
  26.         OutputWriter out = new OutputWriter(outputStream);
  27.         BuildingAResearchAndDevelopmentCenter solver = new BuildingAResearchAndDevelopmentCenter();
  28.         solver.solve(1, in, out);
  29.         out.close();
  30.     }
  31.  
  32.     static class BuildingAResearchAndDevelopmentCenter {
  33.         public void solve(int testNumber, InputReader in, OutputWriter out) {
  34.             int n = in.readInteger();
  35.             int q = in.readInteger();
  36.             int[] seniority = new int[n];
  37.             for (int i = 0; i < n; i++) {
  38.                 int id = in.readInteger();
  39.                 seniority[id] = n - i;
  40.             }
  41.             DisjointSetUnion dsu = new DisjointSetUnion(n, seniority);
  42.  
  43.             for (int i = 0; i < q; i++) {
  44.                 int query = in.readInteger();
  45.                 if (query == 1) {
  46.                     int id1 = in.readInteger();
  47.                     int id2 = in.readInteger();
  48.                     dsu.union(id1, id2);
  49.                 } else if (query == 2) {
  50.                     int id = in.readInteger();
  51.                     seniority[id]++;
  52.  
  53.                     int parent = dsu.find(id);
  54.                     int seniorId = dsu.getSenior(parent);
  55.  
  56.                     if (seniority[id] > seniority[seniorId]) dsu.setSenior(parent, id);
  57.                     else if (seniority[seniorId] == seniority[seniorId]) dsu.setSenior(parent, Math.max(id, seniorId));
  58.                 } else {
  59.                     out.printLine(dsu.getSenior(in.readInteger()));
  60.                 }
  61.             }
  62.         }
  63.  
  64.     }
  65.  
  66.     static class DisjointSetUnion {
  67.         int[] senior;
  68.         int[] seniority;
  69.         private List<Integer> link;
  70.         private List<Integer> size;
  71.  
  72.         private void init(int nodes) {
  73.             for (int i = 0; i < nodes; i++) {
  74.                 this.senior[i] = i;
  75.                 link.add(i);
  76.                 size.add(1);
  77.             }
  78.         }
  79.  
  80.         public DisjointSetUnion(int nodes, int[] seniority) {
  81.             link = new ArrayList<>();
  82.             size = new ArrayList<>();
  83.             senior = new int[nodes];
  84.             this.seniority = seniority;
  85.             this.init(nodes);
  86.         }
  87.  
  88.         public int find(int node) {
  89.             if (node == link.get(node)) return node;
  90.  
  91.             link.set(node, find(link.get(node)));
  92.             return link.get(node);
  93.         }
  94.  
  95.         public int getSenior(int id) {
  96.             return senior[id] = senior[find(id)];
  97.         }
  98.  
  99.         public void setSenior(int id, int who) {
  100.             this.senior[id] = who;
  101.         }
  102.  
  103.         public void union(int firstNode, int secondNode) {
  104.             firstNode = find(firstNode);
  105.             secondNode = find(secondNode);
  106.  
  107.             if (size.get(firstNode) < size.get(secondNode))
  108.                 firstNode = Swap.between(secondNode, secondNode = firstNode);
  109.             size.set(firstNode, size.get(firstNode) + size.get(secondNode));
  110.             link.set(secondNode, firstNode);
  111.  
  112.             int sn;
  113.             if (seniority[firstNode] > seniority[secondNode]) sn = firstNode;
  114.             else if (seniority[firstNode] == seniority[secondNode]) {
  115.                 sn = Math.max(firstNode, secondNode);
  116.             } else sn = secondNode;
  117.             senior[firstNode] = senior[secondNode] = sn;
  118.         }
  119.  
  120.     }
  121.  
  122.     static class InputReader {
  123.         private int curChar;
  124.         private int numChars;
  125.         private InputReader.SpaceCharFilter filter;
  126.         private final InputStream stream;
  127.         private final byte[] buf = new byte[1024];
  128.  
  129.         public InputReader(InputStream stream) {
  130.             this.stream = stream;
  131.         }
  132.  
  133.         private long readWholeNumber(int c) {
  134.             long res = 0;
  135.             do {
  136.                 if (c < '0' || c > '9') {
  137.                     throw new InputMismatchException();
  138.                 }
  139.                 res *= 10;
  140.                 res += c - '0';
  141.                 c = read();
  142.             } while (!isSpaceChar(c));
  143.             return res;
  144.         }
  145.  
  146.         public int read() {
  147.             if (numChars == -1) {
  148.                 throw new InputMismatchException();
  149.             }
  150.             if (curChar >= numChars) {
  151.                 curChar = 0;
  152.                 try {
  153.                     numChars = stream.read(buf);
  154.  
  155.                 } catch (IOException e) {
  156.                     throw new InputMismatchException();
  157.                 }
  158.                 if (numChars <= 0) {
  159.                     return -1;
  160.                 }
  161.             }
  162.             return buf[curChar++];
  163.         }
  164.  
  165.         public int readInteger() {
  166.             int c = read();
  167.             while (isSpaceChar(c)) {
  168.                 c = read();
  169.             }
  170.             int sgn = 1;
  171.             if (c == '-') {
  172.                 sgn = -1;
  173.                 c = read();
  174.             }
  175.             int res = (int) readWholeNumber(c);
  176.             return res * sgn;
  177.         }
  178.  
  179.         public boolean isSpaceChar(int c) {
  180.             if (filter != null) {
  181.                 return filter.isSpaceChar(c);
  182.             }
  183.             return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
  184.         }
  185.  
  186.         public interface SpaceCharFilter {
  187.             boolean isSpaceChar(int ch);
  188.  
  189.         }
  190.  
  191.     }
  192.  
  193.     static class Swap {
  194.         public static <T> T between(T a, T b) {
  195.             return a;
  196.         }
  197.  
  198.     }
  199.  
  200.     static class OutputWriter {
  201.         private final PrintWriter writer;
  202.  
  203.         public OutputWriter(OutputStream outputStream) {
  204.             writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
  205.         }
  206.  
  207.         public OutputWriter(Writer writer) {
  208.             this.writer = new PrintWriter(writer);
  209.         }
  210.  
  211.         public void print(Object... objects) {
  212.             for (int i = 0; i < objects.length; i++) {
  213.                 if (i != 0) {
  214.                     writer.print(' ');
  215.                 }
  216.                 writer.print(objects[i]);
  217.             }
  218.         }
  219.  
  220.         public void printLine(Object... objects) {
  221.             this.print(objects);
  222.             writer.println();
  223.         }
  224.  
  225.         public void close() {
  226.             writer.flush();
  227.             writer.close();
  228.         }
  229.  
  230.     }
  231. }
  232.  
  233.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement