summaryrefslogblamecommitdiffstats
path: root/šola/p1/dn/DN10_63230317.java
blob: 25dc70f0a87b3adc797f97927e6aad559e916b52 (plain) (tree)












































































































































                                                                                                                                               
import java.util.*;
import java.util.stream.*;
public class DN10_63230317 {
	static class Trit implements Comparable<Trit> {
		int vrednost;
		public Trit (String s) {
			vrednost = 3;
			if (s.equals("da"))
				vrednost = 0;
			if (s.equals("ne"))
				vrednost = 1;
			if (s.equals("morda"))
				vrednost = 2;
		}
		@Override
		public String toString () {
			String s[] = new String[]{"da", "ne", "morda", "nedefinirano"};
			return s[vrednost];
		}
		@Override
		public int compareTo (Trit o) {
			return Integer.compare(vrednost, o.vrednost);
		}
	}
	static class Vrednost implements Comparable<Vrednost> {
		int tip;
		String niz;
		Trit trit;
		int št;
		public Vrednost (String s) {
			tip = 2;
			niz = s;
		}
		public Vrednost (Trit t) {
			tip = 3;
			trit = t;
		}
		public Vrednost (int š) {
			tip = 1;
			št = š;
		}
		@Override
		public String toString () {
			switch (tip) {
				case 1:
					return Integer.valueOf(št).toString();
				case 2:
					return niz;
				case 3:
					return trit.toString();
			}
			return null;
		}
		@Override
		public int compareTo (Vrednost o) {
			if (tip != o.tip)
				return Integer.compare(tip, o.tip);
			switch (tip) {
				case 1:
					return Integer.compare(št, o.št);
				case 2:
					return niz.compareTo(o.niz);
				case 3:
					return trit.compareTo(o.trit);
			}
			throw new RuntimeException("unreachable");
		}
	}
	static class Vrstica {
		Vrednost stolpci[];
		public Vrstica (Vrednost[] s) {
			stolpci = s;
		}
		public Vrstica (int tipi[], String s) {
			stolpci = new Vrednost[tipi.length];
			int i = 0;
			if (s.split(" ").length != tipi.length)
				throw new RuntimeException("nepravilno število stolpcev. niz je " + s + ", tipov je " + tipi.length);
			for (String a : s.split(" ")) {
				switch (tipi[i]) {
					case 1:
						stolpci[i++] = new Vrednost(Integer.parseInt(a));
						continue;
					case 2:
						stolpci[i++] = new Vrednost(a);
						continue;
					case 3:
						stolpci[i++] = new Vrednost(new Trit(a));
						continue;
				}
				throw new RuntimeException("nepoznan tip");
			}
		}
		static class Primerjalnik implements Comparator<Vrstica> {
			int kriteriji[];
			public Primerjalnik (int[] k) {
				kriteriji = k;
			}
			@Override
			public int compare (Vrstica a, Vrstica b) {
				for (int i = 0; i < kriteriji.length; i++) {
					int r = a.stolpci[(int) Math.abs(kriteriji[i])-1].compareTo(b.stolpci[(int) Math.abs(kriteriji[i])-1]);
					if (r == 0)
						continue;
					return (int) Math.signum(kriteriji[i])*r;
				}
				return 0;
			}
		}
		public static Comparator<Vrstica> primerjalnik (int[] kriteriji) {
			return new Primerjalnik(kriteriji);
		}
		@Override
		public String toString () {
			return String.join("|", Arrays.asList(stolpci).stream().map(s -> s.toString()).collect(Collectors.toList()));
		}
	}
	public static void main (String[] args) {
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		int tipi[] = new int[n];
		for (int i = 0; i < n; i++)
			tipi[i] = sc.nextInt();
		int k = sc.nextInt();
		int kriteriji[] = new int[k];
		for (int i = 0; i < k; i++)
			kriteriji[i] = sc.nextInt();
		sc.nextLine(); // preskočimo do konca te vrstice s številkami
		ArrayList<Vrstica> vrstice = new ArrayList<>();
		for (int i = 0; i < m; i++) {
			String besedilo = sc.nextLine();
			if (besedilo.equals(""))
				throw new RuntimeException("prazna vrstica na indeksu " + i + " od skupno " + m);
			vrstice.add(new Vrstica(tipi, besedilo));
		}
		Collections.sort(vrstice, Vrstica.primerjalnik(kriteriji));
		for (Vrstica vrstica : vrstice)
			System.out.println(vrstica.toString());
	}
}