qwerty787788

Persistent Array

Jan 11th, 2013
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.82 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class Persistent {
  5.     FastScanner in;
  6.     PrintWriter out;
  7.    
  8.     int MAX = (int) (5 * 1e6);
  9.    
  10.     int[] vertexL = new int[MAX];
  11.     int[] vertexR = new int[MAX];
  12.     int[] vertexV = new int[MAX];
  13.     int vertexSz = 0;
  14.  
  15.     class PersistentArray {
  16.         private int n;
  17.         private int[] roots;
  18.         private int rootsSize;
  19.  
  20.         int newVertex(int l, int r) {
  21.             vertexL[vertexSz] = l;
  22.             vertexR[vertexSz] = r;
  23.             vertexV[vertexSz] = -1;
  24.             return vertexSz++;
  25.         }
  26.  
  27.         int newVertex(int value) {
  28.             vertexL[vertexSz] = -1;
  29.             vertexR[vertexSz] = -1;
  30.             vertexV[vertexSz] = value;
  31.             return vertexSz++;
  32.         }
  33.  
  34.         private int add(int[] values, int l, int r) {
  35.             if (r < l) {
  36.                 return newVertex(0);
  37.             }
  38.             if (r == l) {
  39.                 return newVertex(values[l]);
  40.             } else {
  41.                 int m = (l + r) / 2;
  42.                 return newVertex(add(values, l, m), add(values, m + 1, r));
  43.             }
  44.         }
  45.  
  46.         public PersistentArray(int[] values, int m) {
  47.             roots = new int[m];
  48.             roots[rootsSize++] = add(values, 0, values.length - 1);
  49.             n = values.length;
  50.         }
  51.  
  52.         private int change(int now, int position, int newValue, int l, int r) {
  53.             if (l == r) {
  54.                 return newVertex(newValue);
  55.             } else {
  56.                 int m = (l + r) / 2;
  57.                 if (m >= position) {
  58.                     return newVertex(
  59.                             change(vertexL[now], position, newValue, l, m),
  60.                             vertexR[now]);
  61.                 } else {
  62.                     return newVertex(vertexL[now],
  63.                             change(vertexR[now], position, newValue, m + 1, r));
  64.                 }
  65.             }
  66.         }
  67.  
  68.         public void change(int version, int position, int newValue) {
  69.             roots[rootsSize++] = change(roots[version - 1], position - 1,
  70.                     newValue, 0, n - 1);
  71.         }
  72.  
  73.         public int get(int v, int position, int l, int r) {
  74.             if (l == r)
  75.                 return vertexV[v];
  76.             int m = (l + r) / 2;
  77.             if (m >= position)
  78.                 return get(vertexL[v], position, l, m);
  79.             return get(vertexR[v], position, m + 1, r);
  80.         }
  81.     }
  82.  
  83.     void solve() {
  84.         int n = in.nextInt();
  85.         int[] arr = new int[n];
  86.         for (int i = 0; i < n; i++)
  87.             arr[i] = in.nextInt();
  88.         int m = in.nextInt();
  89.         PersistentArray a = new PersistentArray(arr, m + 1);
  90.         for (int i = 0; i < m; i++) {
  91.             String cmd = in.next();
  92.             if (cmd.equals("create")) {
  93.                 a.change(in.nextInt(), in.nextInt(), in.nextInt());
  94.             } else {
  95.                 out.println(a.get(a.roots[in.nextInt() - 1], in.nextInt() - 1, 0,
  96.                         n - 1));
  97.             }
  98.         }
  99.     }
  100.  
  101.     void run() {
  102.         try {
  103.             in = new FastScanner(new File("object.in"));
  104.             out = new PrintWriter(new File("object.out"));
  105.  
  106.             solve();
  107.  
  108.             out.close();
  109.         } catch (FileNotFoundException e) {
  110.             e.printStackTrace();
  111.         }
  112.     }
  113.  
  114.     void runIO() {
  115.  
  116.         in = new FastScanner(System.in);
  117.         out = new PrintWriter(System.out);
  118.  
  119.         solve();
  120.  
  121.         out.close();
  122.     }
  123.  
  124.     class FastScanner {
  125.         BufferedReader br;
  126.         StringTokenizer st;
  127.  
  128.         public FastScanner(File f) {
  129.             try {
  130.                 br = new BufferedReader(new FileReader(f));
  131.             } catch (FileNotFoundException e) {
  132.                 e.printStackTrace();
  133.             }
  134.         }
  135.  
  136.         public FastScanner(InputStream f) {
  137.             br = new BufferedReader(new InputStreamReader(f));
  138.         }
  139.  
  140.         String next() {
  141.             while (st == null || !st.hasMoreTokens()) {
  142.                 String s = null;
  143.                 try {
  144.                     s = br.readLine();
  145.                 } catch (IOException e) {
  146.                     e.printStackTrace();
  147.                 }
  148.                 if (s == null)
  149.                     return null;
  150.                 st = new StringTokenizer(s);
  151.             }
  152.             return st.nextToken();
  153.         }
  154.  
  155.         boolean hasMoreTokens() {
  156.             while (st == null || !st.hasMoreTokens()) {
  157.                 String s = null;
  158.                 try {
  159.                     s = br.readLine();
  160.                 } catch (IOException e) {
  161.                     e.printStackTrace();
  162.                 }
  163.                 if (s == null)
  164.                     return false;
  165.                 st = new StringTokenizer(s);
  166.             }
  167.             return true;
  168.         }
  169.  
  170.         int nextInt() {
  171.             return Integer.parseInt(next());
  172.         }
  173.  
  174.         long nextLong() {
  175.             return Long.parseLong(next());
  176.         }
  177.     }
  178.  
  179.     public static void main(String[] args) {
  180.         new Persistent().runIO();
  181.     }
  182. }
Advertisement
Add Comment
Please, Sign In to add comment