Submission #697809

#TimeUsernameProblemLanguageResultExecution timeMemory
697809vjudge1Birthday gift (IZhO18_treearray)Java
30 / 100
4064 ms21548 KiB
import java.io.*; import java.math.BigInteger; import java.util.*; import java.util.stream.IntStream; import static java.lang.Math.*; import static java.util.Arrays.*; import static java.util.stream.IntStream.*; /********************************************/ public class treearray { public static void main(String[] args) throws IOException { new Solution().run(); } } /********************************************/ class Solution { final FastScanner scanner = new FastScanner(); final PrintWriter out = new PrintWriter(System.out); final int mod = (int) 1e9+7; final int[] dx = {1, 0, -1, 0}; final int[] dy = {0, 1, 0, -1}; int maxn = (int) 3e5+10; int n, m, q, timer; int[] a, d, tin, tout; int[][] up; void solve() throws IOException { n = scanner.nextInt(); m = scanner.nextInt(); q = scanner.nextInt(); init(n); up = new int[20][n+1]; a = new int[m+1]; d = new int[n+1]; tin = new int[n+1]; tout = new int[n+1]; for (int i = 1; i<n; i++) { int x = scanner.nextInt(), y = scanner.nextInt(); g[x].add(y); g[y].add(x); } for (int i = 1; i<=m; i++) { a[i] = scanner.nextInt(); } dfs(1, 1); outer: while (q-->0) { int t = scanner.nextInt(); if (t == 1) { int pos = scanner.nextInt(), v = scanner.nextInt(); a[pos] = v; } else { int l = scanner.nextInt(), r = scanner.nextInt(), v = scanner.nextInt(); int curr = 0; for (int x = l; x <= r; x++) { for (int y = x; y <= r; y++) { if (y == x) curr = a[y]; else curr = lca(curr, a[y]); if (curr == v) { out.println(x+" "+y); continue outer; } if (!isPar(v, curr)) break; } } out.println("-1 -1"); } } } void dfs(int v, int pr){ tin[v] = ++timer; up[0][v] = pr; for(int i = 1; i < 19; i++){ up[i][v] = up[i-1][up[i-1][v]]; } d[v] = d[pr] + 1; for(var to : g[v]) { if(to == pr) continue; dfs(to, v); } tout[v] = ++timer; } int lca(int u, int v){ if(d[u] < d[v]) { int temp = u; u = v; v = temp; } for(int i = 18; i >= 0; i--){ if(d[u] - (1<<i) >= d[v]) { u = up[i][u]; } } if(u == v) return u; for(int i = 18; i >= 0; i--){ if(up[i][u] != up[i][v]) { u = up[i][u]; v = up[i][v]; } } return up[0][v]; } boolean isPar(int a, int b) { return tin[a] <= tin[b] && tout[a] >= tout[b]; } List<Integer>[] g; boolean[] was; void init(int n) { g = new ArrayList[n+1]; was = new boolean[n+1]; for (int i = 0; i<=n; i++) { g[i] = new ArrayList<>(); } } void run() throws IOException { int t = 1; while (t-->0) { solve(); } out.flush(); } } class FastScanner { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int nextInt() throws IOException { int x = 0, sign = 1; char c = (char) br.read(); while ((c < '0' || c > '9') && c != '-') { c = (char) br.read(); } if (c == '-') { sign = -1; c = (char) br.read(); } while (c >= '0' && c <= '9') { x = (x << 3) + (x << 1) + (c & 15); c = (char) br.read(); } return sign * x; } long nextLong() throws IOException { long x = 0, sign = 1; char c = (char) br.read(); while ((c < '0' || c > '9') && c != '-') { c = (char) br.read(); } if (c == '-') { sign = -1; c = (char) br.read(); } while (c >= '0' && c <= '9') { x = (x << 3) + (x << 1) + (c & 15); c = (char) br.read(); } return sign * x; } String next() throws IOException { StringBuilder sb = new StringBuilder(); char c = (char) br.read(); while (c == ' ' || c == '\n' || c == '\r') { c = (char) br.read(); } while (c != ' ' && c != '\n' && c != '\r') { sb.append(c); c = (char) br.read(); } return sb.toString(); } int[] readArray(int n) throws IOException { int[] a = new int[n]; for (int i = 0; i < n; i++) a[i] = nextInt(); return a; } long[] readLong(int n) throws IOException { long[] a = new long[n]; for (int i = 0; i < n; i++) a[i] = nextInt(); return a; } }

Compilation message (stderr)

Note: treearray.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...