Advertisement
IzhanVarsky

Разреженные таблицы

Mar 19th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.95 KB | None | 0 0
  1. import java.util.Scanner;
  2.  
  3. public class Main {
  4.  
  5.     private static int[][] st;
  6.     private static int[] logs;
  7.  
  8.     public static void main(String[] args) {
  9.         Scanner in = new Scanner(System.in);
  10.         int n = in.nextInt();
  11.         int m = in.nextInt();
  12.         int a[] = new int[n];
  13.         a[0] = in.nextInt();
  14.         for (int i = 1; i < n; i++) {
  15.             a[i] = (23 * a[i - 1] + 21563) % 16714589;
  16.             if (a[i] < 0) a[i] += 16714589;
  17.         }
  18.         logs = new int[n + 2];
  19.         fillLogs(n + 2);
  20.         st = new int[logs[n] + 2][n];
  21.         st[0] = a;
  22.         for (int k = 1; k < logs[n] + 2; k++) {
  23.             for (int i = 0; i < n - Math.pow(2, k) + 1; i++) {
  24.                 int left = st[k - 1][i];
  25.                 int right = st[k - 1][(int) (i + Math.pow(2, k - 1))];
  26.                 st[k][i] = Math.min(left, right);
  27.             }
  28.         }
  29.         int u = in.nextInt();
  30.         int v = in.nextInt();
  31.         int ans;
  32.         ans = rmq(u - 1, v - 1);
  33.         for (int i = 1; i < m; i++) {
  34.             u = (17 * u + 751 + ans + 2 * i) % n;
  35.             if (u < 0) u += n;
  36.             u++;
  37.             v = (13 * v + 593 + ans + 5 * i) % n;
  38.             if (v < 0) v += n;
  39.             v++;
  40.             ans = rmq(u - 1, v - 1);
  41.         }
  42.         System.out.print(u + " " + v + " " + ans);
  43.     }
  44.  
  45.     private static void fillLogs(int n) {
  46.         logs[1] = 0;
  47.         int start = 1;
  48.         int toPush = 0;
  49.         while (true) {
  50.             int i = start;
  51.             for (; i < start * 2 && i < n; i++) {
  52.                 logs[i] = toPush;
  53.             }
  54.             if (i >= n) break;
  55.             start <<= 1;
  56.             toPush++;
  57.         }
  58.     }
  59.  
  60.     private static int rmq(int i, int j) {
  61.         if (i > j) {
  62.             int t = j;
  63.             j = i;
  64.             i = t;
  65.         }
  66.         int k = logs[j - i + 1];
  67.         return Math.min(st[k][i], st[k][(int) (j - Math.pow(2, k) + 1)]);
  68.     }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement