Advertisement
Guest User

LCA to RMQ

a guest
Aug 28th, 2014
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.53 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.StringTokenizer;
  8.  
  9. public class LCA {
  10.  
  11.     static ArrayList<Integer>[] adj;
  12.     static int[] e, l, h, tree;
  13.     static int idx;
  14.  
  15.     static void dfs(int i, int lvl, int p) {
  16.         e[idx] = i;
  17.         l[idx++] = lvl;
  18.         if (h[i] == -1)
  19.             h[i] = idx - 1;
  20.         for (Integer v : adj[i]) {
  21.             if (v == p)
  22.                 continue;
  23.             dfs(v, lvl + 1, i);
  24.             e[idx] = i;
  25.             l[idx++] = lvl;
  26.         }
  27.     }
  28.  
  29.     static void build(int idx, int s, int t) {
  30.         if (s == t) {
  31.             tree[idx] = s;
  32.             return;
  33.         }
  34.         int mid = (s + t) / 2;
  35.         build(idx * 2, s, mid);
  36.         build(idx * 2 + 1, mid + 1, t);
  37.         int val1 = l[tree[idx * 2]];
  38.         int val2 = l[tree[idx * 2 + 1]];
  39.         if (val1 < val2)
  40.             tree[idx] = tree[idx * 2];
  41.         else
  42.             tree[idx] = tree[idx * 2 + 1];
  43.     }
  44.  
  45.     static int rqst(int idx, int s, int t, int i, int j) {
  46.         if (t < i || s > j)
  47.             return Integer.MAX_VALUE;
  48.         if (s >= i && t <= j)
  49.             return tree[idx];
  50.         int mid = (s + t) / 2;
  51.         int idx1 = rqst(idx * 2, s, mid, i, j);
  52.         int idx2 = rqst(idx * 2 + 1, mid + 1, t, i, j);
  53.         if (idx1 == Integer.MAX_VALUE)
  54.             return idx2;
  55.         if (idx2 == Integer.MAX_VALUE)
  56.             return idx1;
  57.         int val1 = l[idx1];
  58.         int val2 = l[idx2];
  59.         if (val1 < val2)
  60.             return idx1;
  61.         return idx2;
  62.     }
  63.  
  64.     @SuppressWarnings("unchecked")
  65.     public static void main(String[] args) throws IOException {
  66.         br = new BufferedReader(new InputStreamReader(System.in));
  67.         out = new PrintWriter(System.out);
  68.         sc = new StringTokenizer("");
  69.         adj = new ArrayList[13];
  70.         for (int i = 0; i < 13; i++)
  71.             adj[i] = new ArrayList<>();
  72.         e = new int[25];
  73.         l = new int[25];
  74.         h = new int[13];
  75.         for (int i = 0; i < 12; i++) {
  76.             int x = nxtInt() - 1;
  77.             int y = nxtInt() - 1;
  78.             adj[x].add(y);
  79.             adj[y].add(x);
  80.         }
  81.         Arrays.fill(h, -1);
  82.         dfs(0, 0, -1);
  83.         for (int i = 0; i < e.length; i++) {
  84.             out.print(e[i] + 1 + " ");
  85.         }
  86.         out.println();
  87.         for (int i = 0; i < l.length; i++) {
  88.             out.print(l[i] + " ");
  89.         }
  90.         out.println();
  91.         for (int i = 0; i < h.length; i++) {
  92.             out.print(h[i] + 1 + " ");
  93.         }
  94.         out.println();
  95.         tree = new int[4 * 25];
  96.         build(1, 0, l.length - 1);
  97.         while (true) {
  98.             int x = nxtInt();
  99.             int y = nxtInt();
  100.             if (x == y && x == -1)
  101.                 break;
  102.             int val1 = h[x - 1];
  103.             int val2 = h[y - 1];
  104.             if (val1 > val2) {
  105.                 val1 ^= val2;
  106.                 val2 ^= val1;
  107.                 val1 ^= val2;
  108.             }
  109.             int ans = rqst(1, 0, l.length - 1, val1, val2);
  110.             out.println(e[ans] + 1);
  111.         }
  112.         br.close();
  113.         out.close();
  114.     }
  115.  
  116.     static BufferedReader br;
  117.     static StringTokenizer sc;
  118.     static PrintWriter out;
  119.  
  120.     static String nxtTok() throws IOException {
  121.         while (!sc.hasMoreTokens()) {
  122.             String s = br.readLine();
  123.             if (s == null)
  124.                 return null;
  125.             sc = new StringTokenizer(s.trim());
  126.         }
  127.         return sc.nextToken();
  128.     }
  129.  
  130.     static int nxtInt() throws IOException {
  131.         return Integer.parseInt(nxtTok());
  132.     }
  133.  
  134.     static long nxtLng() throws IOException {
  135.         return Long.parseLong(nxtTok());
  136.     }
  137.  
  138.     static double nxtDbl() throws IOException {
  139.         return Double.parseDouble(nxtTok());
  140.     }
  141.  
  142.     static int[] nxtIntArr(int n) throws IOException {
  143.         int[] a = new int[n];
  144.         for (int i = 0; i < n; i++)
  145.             a[i] = nxtInt();
  146.         return a;
  147.     }
  148.  
  149.     static long[] nxtLngArr(int n) throws IOException {
  150.         long[] a = new long[n];
  151.         for (int i = 0; i < n; i++)
  152.             a[i] = nxtLng();
  153.         return a;
  154.     }
  155.  
  156.     static char[] nxtCharArr() throws IOException {
  157.         return nxtTok().toCharArray();
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement