Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.56 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.PrintWriter;
  7. import java.math.BigInteger;
  8. import java.util.ArrayList;
  9. import java.util.HashMap;
  10. import java.util.StringTokenizer;
  11.  
  12. public class Solution implements Runnable {
  13.     private BufferedReader br;
  14.     private StringTokenizer tok;
  15.     private PrintWriter out;
  16.    
  17.     public static final boolean ONLINE_JUDGE = System.getProperty("ONLINE_JUDGE") != null;
  18.     public static final int MAGIC = 21;
  19.    
  20.     ArrayList<Integer>[] g;
  21.    
  22.     int[] p;
  23.     int[] h;
  24.     int[] id;
  25.     int[][] dp;
  26.    
  27.     void initGraph(int n) {
  28.         g = new ArrayList[n];
  29.         for (int i = 0; i < n; ++i) {
  30.             g[i] = new ArrayList<Integer>();
  31.         }
  32.     }
  33.    
  34.     void dfs(int v, int pv, int height, int par) {
  35.         p[v] = pv;
  36.         h[v] = height;
  37.         id[v] = par;
  38.         for (int i = 0; i < g[v].size(); ++i) {
  39.             int to = g[v].get(i);
  40.             dfs(to, v, height + 1, par);
  41.         }
  42.     }
  43.    
  44.     void prepare(int n) {
  45.         dp = new int[n][MAGIC];
  46.         for (int j = 0; j < MAGIC; ++j)
  47.             for (int i = 0; i < n; ++i)
  48.                 if (j == 0) {
  49.                     dp[i][j] = p[j];
  50.                 } else {
  51.                     dp[i][j] = dp[dp[i][j - 1]][j - 1];
  52.                 }
  53.     }
  54.    
  55.     int getAncestor(int v, int dg) {
  56.         int u = v;
  57.         int dif = dg;
  58.         for (int i = 17; i >= 0; --i)
  59.             if (dif >= (1 << i)) {
  60.                 dif -= 1 << i;
  61.                 u = dp[u][i];
  62.             }
  63.         if (h[v] - h[u] != dg)
  64.             return - 1;
  65.         return u;
  66.     }
  67.        
  68.     void solve() throws IOException {
  69.         int n = nextInt();
  70.         initGraph(n);
  71.         ArrayList<Integer> roots = new ArrayList<Integer>();
  72.         for (int i = 0; i < n; ++i) {
  73.             int pv = nextInt() - 1;
  74.             if (pv != -1) {
  75.                 g[pv].add(i);
  76.             } else {
  77.                 roots.add(i);
  78.             }
  79.         }
  80.         p = new int[n];
  81.         h = new int[n];
  82.         id = new int[n];
  83.         for (int i = 0; i < roots.size(); ++i) {
  84.             dfs(roots.get(i), roots.get(i), 0, i);
  85.         }
  86.         prepare(n);
  87.         HashMap<Integer, Integer>[] cnt = new HashMap[MAGIC];
  88.         for (int i = 0; i < MAGIC; ++i) {
  89.             cnt[i] = new HashMap<Integer, Integer>();
  90.         }
  91.         for (int i = 0; i < n; ++i)
  92.             if (cnt[h[i]].containsKey(id[i])) {
  93.                 int value = cnt[h[i]].get(id[i]);
  94.                 cnt[h[i]].remove(id[i]);
  95.                 cnt[h[i]].put(id[i], value + 1);
  96.             } else {
  97.                 cnt[h[i]].put(id[i], 1);
  98.             }
  99.         int q = nextInt();
  100.         for (int i = 0; i < q; ++i) {
  101.             int v = nextInt();
  102.             int a = nextInt();
  103.             int u = getAncestor(v - 1, a);
  104.             if (u == -1) {
  105.                 out.print("0 ");
  106.             } else {
  107.                 out.print((cnt[h[v - 1]].get(id[v - 1]) - 1) + " ");
  108.             }
  109.         }
  110.     }
  111.        
  112.     public void run() {
  113.         try {
  114.             if (ONLINE_JUDGE) {
  115.                 br = new BufferedReader(new InputStreamReader(System.in));
  116.                 out = new PrintWriter(System.out);
  117.             } else {
  118.                 br = new BufferedReader(new FileReader(new File("input.txt")));
  119.                 out = new PrintWriter(new File("output.txt"));
  120.             }
  121.             solve();
  122.             br.close();
  123.             out.close();
  124.         } catch (IOException e) {
  125.             e.printStackTrace();
  126.             System.exit(1);
  127.         }
  128.     }
  129.    
  130.     public static void main(String[] args) {
  131.         new Solution().run();
  132.     }  
  133.    
  134.     String nextToken() throws IOException {
  135.         while (tok == null || !tok.hasMoreTokens())
  136.             tok = new StringTokenizer(br.readLine());
  137.         return tok.nextToken();
  138.     }
  139.    
  140.     String nextString() throws IOException {
  141.         return nextToken();
  142.     }
  143.    
  144.     int nextInt() throws IOException {
  145.         return Integer.parseInt(nextToken());
  146.     }
  147.    
  148.     long nextLong() throws IOException {
  149.         return Long.parseLong(nextToken());
  150.     }
  151.    
  152.     double nextDouble() throws IOException {
  153.         return Double.parseDouble(nextToken());
  154.     }
  155.    
  156.     BigInteger nextBigInteger() throws IOException {
  157.         return new BigInteger(nextToken());
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement