Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.util.*;
- public class Persistent {
- FastScanner in;
- PrintWriter out;
- int MAX = (int) (5 * 1e6);
- int[] vertexL = new int[MAX];
- int[] vertexR = new int[MAX];
- int[] vertexV = new int[MAX];
- int vertexSz = 0;
- class PersistentArray {
- private int n;
- private int[] roots;
- private int rootsSize;
- int newVertex(int l, int r) {
- vertexL[vertexSz] = l;
- vertexR[vertexSz] = r;
- vertexV[vertexSz] = -1;
- return vertexSz++;
- }
- int newVertex(int value) {
- vertexL[vertexSz] = -1;
- vertexR[vertexSz] = -1;
- vertexV[vertexSz] = value;
- return vertexSz++;
- }
- private int add(int[] values, int l, int r) {
- if (r < l) {
- return newVertex(0);
- }
- if (r == l) {
- return newVertex(values[l]);
- } else {
- int m = (l + r) / 2;
- return newVertex(add(values, l, m), add(values, m + 1, r));
- }
- }
- public PersistentArray(int[] values, int m) {
- roots = new int[m];
- roots[rootsSize++] = add(values, 0, values.length - 1);
- n = values.length;
- }
- private int change(int now, int position, int newValue, int l, int r) {
- if (l == r) {
- return newVertex(newValue);
- } else {
- int m = (l + r) / 2;
- if (m >= position) {
- return newVertex(
- change(vertexL[now], position, newValue, l, m),
- vertexR[now]);
- } else {
- return newVertex(vertexL[now],
- change(vertexR[now], position, newValue, m + 1, r));
- }
- }
- }
- public void change(int version, int position, int newValue) {
- roots[rootsSize++] = change(roots[version - 1], position - 1,
- newValue, 0, n - 1);
- }
- public int get(int v, int position, int l, int r) {
- if (l == r)
- return vertexV[v];
- int m = (l + r) / 2;
- if (m >= position)
- return get(vertexL[v], position, l, m);
- return get(vertexR[v], position, m + 1, r);
- }
- }
- void solve() {
- int n = in.nextInt();
- int[] arr = new int[n];
- for (int i = 0; i < n; i++)
- arr[i] = in.nextInt();
- int m = in.nextInt();
- PersistentArray a = new PersistentArray(arr, m + 1);
- for (int i = 0; i < m; i++) {
- String cmd = in.next();
- if (cmd.equals("create")) {
- a.change(in.nextInt(), in.nextInt(), in.nextInt());
- } else {
- out.println(a.get(a.roots[in.nextInt() - 1], in.nextInt() - 1, 0,
- n - 1));
- }
- }
- }
- void run() {
- try {
- in = new FastScanner(new File("object.in"));
- out = new PrintWriter(new File("object.out"));
- solve();
- out.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- }
- void runIO() {
- in = new FastScanner(System.in);
- out = new PrintWriter(System.out);
- solve();
- out.close();
- }
- class FastScanner {
- BufferedReader br;
- StringTokenizer st;
- public FastScanner(File f) {
- try {
- br = new BufferedReader(new FileReader(f));
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- }
- public FastScanner(InputStream f) {
- br = new BufferedReader(new InputStreamReader(f));
- }
- String next() {
- while (st == null || !st.hasMoreTokens()) {
- String s = null;
- try {
- s = br.readLine();
- } catch (IOException e) {
- e.printStackTrace();
- }
- if (s == null)
- return null;
- st = new StringTokenizer(s);
- }
- return st.nextToken();
- }
- boolean hasMoreTokens() {
- while (st == null || !st.hasMoreTokens()) {
- String s = null;
- try {
- s = br.readLine();
- } catch (IOException e) {
- e.printStackTrace();
- }
- if (s == null)
- return false;
- st = new StringTokenizer(s);
- }
- return true;
- }
- int nextInt() {
- return Integer.parseInt(next());
- }
- long nextLong() {
- return Long.parseLong(next());
- }
- }
- public static void main(String[] args) {
- new Persistent().runIO();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment