Cod sursa(job #1939415)

Utilizator lucibitLucian Onea lucibit Data 25 martie 2017 18:33:03
Problema Stramosi Scor 70
Compilator java Status done
Runda Arhiva de probleme Marime 3.15 kb
import java.io.*;
import java.util.*;

public class Main {

    private final static String IN_FILE = "stramosi.in";
    private final static String OUT_FILE = "stramosi.out";


    class AncestorPQ {
        int rank, node;
        public AncestorPQ(int rank, int node) {
            this.rank=rank;
            this.node=node;
        }
    }

    static SortedMap<Integer, Integer>[] a;
    static int parent[];

    private static int dig(int p, int q) {
        //System.out.println("step");
        if (p == 0) {
            return 0;
        }
        if (a[p].get(q) !=null) {
           return a[p].get(q);
        }
        else {
            SortedMap<Integer, Integer> ranks = a[p];
            Integer found = null;
            for(Integer rank: ranks.keySet()) {
                if (rank < q) {
                    found = rank;
                    break;
                }
            }
            int res;
            if (found != null) {
                //System.out.println("going deeper " + found );
                res = dig(ranks.get(found), q-found);
            } else {
                res = dig(parent[p], q-1);
            }

            a[p].put(q, res);
            return res;
        }

    }

    public static void main(String[] args) {
        try {
            //READING PART
            BufferedReader br = new BufferedReader(new FileReader(IN_FILE));
            String line1 = br.readLine();
            StringTokenizer st = new StringTokenizer(line1);
            int i, j;

            int n = Integer.valueOf(st.nextToken());
            int m = Integer.valueOf(st.nextToken());
            parent = new int[n+1];
            st = new StringTokenizer(br.readLine());
            i=1;
            while(st.hasMoreTokens()) {
               parent[i++] = Integer.valueOf(st.nextToken());
            }


            a = (TreeMap<Integer, Integer>[]) new TreeMap<?,?>[n+1];

            for (i = 1; i <= n; i++ ) {
                a[i] = new TreeMap<Integer, Integer>(new Comparator<Integer>() {
                    @Override
                    public int compare(Integer o1, Integer o2) {
                        return o2-o1;
                    }
                });
                a[i].put(1, parent[i]);
            }


            BufferedWriter bw = new BufferedWriter(new FileWriter(OUT_FILE));
            for (int t = 0; t < m; t++) {
                st = new StringTokenizer(br.readLine());
                int p = Integer.valueOf(st.nextToken());
                int q = Integer.valueOf(st.nextToken());
                bw.write(String.valueOf(dig(p,q)));
                bw.write('\n');

            }

            br.close();

//            for(i = 1; i< n; i++) {
//                SortedMap<Integer, Integer> ranks = a[i];
//                System.out.println("Node: "+ i);
//                for(Integer rank: ranks.keySet()) {
//                    System.out.println(rank + "->" +  ranks.get(rank));
//                }
//            }


            bw.write(String.valueOf(0));
            bw.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}