Advertisement
Guest User

USACO Cowland Gold

a guest
Jul 17th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.72 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.io.PrintWriter;
  8. import java.util.ArrayList;
  9. import java.util.Arrays;
  10. import java.util.StringTokenizer;
  11.  
  12. public class E {
  13.     static FastReader scan;
  14.     static PrintWriter out;
  15.  
  16.     public static void main(String[] args) throws FileNotFoundException {
  17.         Solver solver = new Solver();
  18.         scan = new FastReader("cowland.in");
  19.         out = new PrintWriter("cowland.out");
  20. //      scan = new FastReader();
  21. //      out = new PrintWriter(System.out);
  22.         int testCases = 1;
  23.         for(int i = 1; i <= testCases; i++) {
  24. //          out.print("Case #" + i + ": ");
  25.             solver.solve();
  26.         }
  27.         out.close();
  28.     }
  29.  
  30.     static class Solver {
  31.        
  32.         static int n, q;
  33.         static long[] e, xor;
  34.         static long[] tree, lazy;
  35.         static int[] end, begin, depth, euler;
  36.         static int[][] parent;
  37.         static int index = 0;
  38.         static ArrayList<Integer>[] adj;
  39.        
  40.         void solve() {
  41.             n = scan.nextInt();
  42.             q = scan.nextInt();
  43.             e = scan.nextLongArray(n);
  44.             xor = new long[n];
  45.             tree = new long[4*n];
  46.             lazy = new long[4*n];
  47.             euler = new int[n];
  48.             begin = new int[n];
  49.             end = new int[n];
  50.             depth = new int[n+1];
  51.             parent = new int[n+1][18];
  52.            
  53.             for(int i = 0; i <= n; i++) Arrays.fill(parent[i], -1);
  54.             adj = new ArrayList[n];
  55.             for(int i = 0; i < n; i++) adj[i] = new ArrayList<>();
  56.             for(int i = 0; i < n-1; i++) {
  57.                 int a = scan.nextInt()-1, b = scan.nextInt()-1;
  58.                 adj[a].add(b);
  59.                 adj[b].add(a);
  60.             }
  61.            
  62.             go(-1,0,0,1);
  63.             precompute();
  64.             build(1, 0, n-1);
  65.            
  66.             for(int i = 0; i < q; i++) {
  67.                 int a = scan.nextInt(), b = scan.nextInt()-1, c = scan.nextInt()-1;
  68.                 if(a==1) {
  69.                     long d = c+1;
  70.                     update(1,0,n-1,begin[b],end[b],e[b]^d);
  71.                     e[b] = d;
  72.                 }
  73.                 else {
  74.                     long bb = get(1,0,n-1,begin[b],begin[b]);
  75.                     long cc = get(1,0,n-1,begin[c],begin[c]);
  76.                     out.println(bb^cc^e[lca(b,c)-1]);
  77.                 }
  78.             }          
  79.         }
  80.        
  81.         static void update(int node, int s, int e, int l, int r, long val) {
  82.             if(lazy[node] != 0) {
  83.                 if((s-e+1)%2==1) tree[node] ^= lazy[node];
  84.                 if(s != e) {
  85.                     lazy[2*node] ^= lazy[node];
  86.                     lazy[2*node+1] ^= lazy[node];
  87.                 }
  88.                 lazy[node] = 0;
  89.             }
  90.             if(s > e || s > r || e < l) return;
  91.             if(s >= l && e <= r) {
  92.                 if((s-e+1)%2==1) tree[node] ^= val;
  93.                 if(s != e) {
  94.                     lazy[2*node] ^= val;
  95.                     lazy[2*node+1] ^= val;
  96.                 }
  97.                 return;
  98.             }
  99.             int mid = (s+e)/2;
  100.             update(node*2,s,mid,l,r,val);
  101.             update(node*2+1,mid+1,e,l,r,val);
  102.             tree[node] = tree[2*node]^tree[2*node+1];
  103.         }
  104.        
  105.         static long get(int node, int s, int e, int l, int r) {
  106.             if(lazy[node] != 0) {
  107.                 if((s-e+1)%2==1) tree[node] ^= lazy[node];
  108.                 if(s != e) {
  109.                     lazy[2*node] ^= lazy[node];
  110.                     lazy[2*node+1] ^= lazy[node];
  111.                 }
  112.                 lazy[node] = 0;
  113.             }
  114.             if(s > e || s > r || e < l) return 0;
  115.             if(s >= l && e <= r) {
  116.                 return tree[node];
  117.             }
  118.             int mid = (s+e)/2;
  119.             long a = get(2*node,s,mid,l,r);
  120.             long b = get(2*node+1,mid+1,e,l,r);
  121.             return a^b;
  122.         }
  123.        
  124.         static void build(int node, int s, int e) {
  125.             if(s > e) return;
  126.             if(s == e) {
  127.                 tree[node] = xor[euler[s]];
  128.                 return;
  129.             }
  130.             int mid = (s+e)/2;
  131.             build(node*2,s,mid);
  132.             build(node*2+1,mid+1,e);
  133.             tree[node] = tree[2*node]^tree[2*node+1];
  134.         }
  135.        
  136.        
  137.         static void go(int p, int curr, long x, int at) {
  138.             begin[curr] = index;
  139.             euler[index] = curr;
  140.             xor[curr] = x^e[curr];
  141.             depth[curr+1] = at;
  142.             parent[curr+1][0] = p+1;
  143.             for(int i : adj[curr]) {
  144.                 if(i != p) {
  145.                     index++;
  146.                     go(curr, i, xor[curr], at+1);
  147.                 }
  148.             }
  149.             end[curr] = index;
  150.         }
  151.        
  152.         static void precompute() {
  153.             for(int i = 1; i < 18; i++) {
  154.                 for(int j = 1; j <= n; j++) {
  155.                     if(parent[j][i-1] != -1) {
  156.                         parent[j][i] = parent[parent[j][i-1]][i-1];
  157.                     }
  158.                 }
  159.             }
  160.         }
  161.        
  162.         static int lca(int a, int b) {
  163.             a++;
  164.             b++;
  165.             if(depth[b] < depth[a]) {
  166.                 int temp = a;
  167.                 a = b;
  168.                 b = temp;
  169.             }
  170.             int diff = depth[b]-depth[a];
  171.             for(int i = 0; i < 18; i++) {
  172.                 if(((diff>>i)&1) != 0) {
  173.                     b = parent[b][i];
  174.                 }
  175.             }
  176.             if(a==b) return a;
  177.             for(int i = 17; i >= 0; i--) {
  178.                 if(parent[a][i] != parent[b][i]) {
  179.                     a = parent[a][i];
  180.                     b = parent[b][i];
  181.                 }
  182.             }
  183.             return parent[a][0];
  184.         }
  185.        
  186.     }
  187.  
  188.     // Sathvik's Template Stuff BELOW!!!!!!!!!!!!!!!!!!!!!!
  189.  
  190.     static class DSU {
  191.         int[] root, size;
  192.         int n;
  193.  
  194.         DSU(int n) {
  195.             this.n = n;
  196.             root = new int[n];
  197.             size = new int[n];
  198.             for (int i = 0; i < n; i++) {
  199.                 root[i] = i;
  200.                 size[i] = 1;
  201.             }
  202.         }
  203.  
  204.         int findParent(int idx) {
  205.             while (root[idx] != idx) {
  206.                 root[idx] = root[root[idx]];
  207.                 idx = root[idx];
  208.             }
  209.             return idx;
  210.         }
  211.  
  212.         boolean union(int x, int y) {
  213.             int parX = findParent(x);
  214.             int parY = findParent(y);
  215.             if (parX == parY)
  216.                 return false;
  217.             if (size[parX] < size[parY]) {
  218.                 root[parY] = parX;
  219.                 size[parX] += size[parY];
  220.             } else {
  221.                 root[parX] = parY;
  222.                 size[parY] += size[parX];
  223.             }
  224.             return true;
  225.         }
  226.     }
  227.  
  228.     static class Extra {
  229.         static void sort(int[] a) {
  230.             Integer[] aa = new Integer[a.length];
  231.             for (int i = 0; i < aa.length; i++)
  232.                 aa[i] = a[i];
  233.             Arrays.sort(aa);
  234.             for (int i = 0; i < aa.length; i++)
  235.                 a[i] = aa[i];
  236.         }
  237.  
  238.         static void sort(long[] a) {
  239.             Long[] aa = new Long[a.length];
  240.             for (int i = 0; i < aa.length; i++)
  241.                 aa[i] = a[i];
  242.             Arrays.sort(aa);
  243.             for (int i = 0; i < aa.length; i++)
  244.                 a[i] = aa[i];
  245.         }
  246.  
  247.         static void sort(double[] a) {
  248.             Double[] aa = new Double[a.length];
  249.             for (int i = 0; i < aa.length; i++)
  250.                 aa[i] = a[i];
  251.             Arrays.sort(aa);
  252.             for (int i = 0; i < aa.length; i++)
  253.                 a[i] = aa[i];
  254.         }
  255.  
  256.         static void sort(char[] a) {
  257.             Character[] aa = new Character[a.length];
  258.             for (int i = 0; i < aa.length; i++)
  259.                 aa[i] = a[i];
  260.             Arrays.sort(aa);
  261.             for (int i = 0; i < aa.length; i++)
  262.                 a[i] = aa[i];
  263.         }
  264.  
  265.         static long gcd(long a, long b) {
  266.             while (b > 0) {
  267.                 long temp = b;
  268.                 b = a % b;
  269.                 a = temp;
  270.             }
  271.             return a;
  272.         }
  273.  
  274.         static long lcm(long a, long b) {
  275.             return a * (b / gcd(a, b));
  276.         }
  277.  
  278.         static boolean isPrime(long n) {
  279.             if (n <= 1)
  280.                 return false;
  281.             if (n <= 3)
  282.                 return true;
  283.             if (n % 2 == 0 || n % 3 == 0)
  284.                 return false;
  285.             for (long i = 5; i * i <= n; i = i + 6) {
  286.                 if (n % i == 0 || n % (i + 2) == 0)
  287.                     return false;
  288.             }
  289.             return true;
  290.         }
  291.     }
  292.  
  293.     static class FastReader {
  294.         BufferedReader br;
  295.         StringTokenizer st;
  296.  
  297.         public FastReader() {
  298.             br = new BufferedReader(new InputStreamReader(System.in));
  299.         }
  300.         public FastReader(String s) throws FileNotFoundException {
  301.             br = new BufferedReader(new FileReader(new File(s)));
  302.         }
  303.  
  304.         String next() {
  305.             while (st == null || !st.hasMoreElements()) {
  306.                 try {
  307.                     st = new StringTokenizer(br.readLine());
  308.                 } catch (IOException e) {
  309.                     e.printStackTrace();
  310.                 }
  311.             }
  312.             return st.nextToken();
  313.         }
  314.  
  315.         int nextInt() {
  316.             return Integer.parseInt(next());
  317.         }
  318.  
  319.         int[] nextIntArray(int n) {
  320.             int[] a = new int[n];
  321.             for (int i = 0; i < n; i++)
  322.                 a[i] = nextInt();
  323.             return a;
  324.         }
  325.  
  326.         long nextLong() {
  327.             return Long.parseLong(next());
  328.         }
  329.  
  330.         long[] nextLongArray(int n) {
  331.             long[] a = new long[n];
  332.             for (int i = 0; i < n; i++)
  333.                 a[i] = nextLong();
  334.             return a;
  335.         }
  336.  
  337.         double nextDouble() {
  338.             return Double.parseDouble(next());
  339.         }
  340.  
  341.         double[] nextDoubleArray(int n) {
  342.             double[] a = new double[n];
  343.             for (int i = 0; i < n; i++)
  344.                 a[i] = nextDouble();
  345.             return a;
  346.         }
  347.  
  348.         String nextLine() {
  349.             String str = "";
  350.             try {
  351.                 str = br.readLine();
  352.             } catch (IOException e) {
  353.                 e.printStackTrace();
  354.             }
  355.             return str;
  356.         }
  357.     }
  358.  
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement