Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.Scanner;
- public class Main {
- private static int[][] st;
- private static int[] logs;
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- int n = in.nextInt();
- int m = in.nextInt();
- int a[] = new int[n];
- a[0] = in.nextInt();
- for (int i = 1; i < n; i++) {
- a[i] = (23 * a[i - 1] + 21563) % 16714589;
- if (a[i] < 0) a[i] += 16714589;
- }
- logs = new int[n + 2];
- fillLogs(n + 2);
- st = new int[logs[n] + 2][n];
- st[0] = a;
- for (int k = 1; k < logs[n] + 2; k++) {
- for (int i = 0; i < n - Math.pow(2, k) + 1; i++) {
- int left = st[k - 1][i];
- int right = st[k - 1][(int) (i + Math.pow(2, k - 1))];
- st[k][i] = Math.min(left, right);
- }
- }
- int u = in.nextInt();
- int v = in.nextInt();
- int ans;
- ans = rmq(u - 1, v - 1);
- for (int i = 1; i < m; i++) {
- u = (17 * u + 751 + ans + 2 * i) % n;
- if (u < 0) u += n;
- u++;
- v = (13 * v + 593 + ans + 5 * i) % n;
- if (v < 0) v += n;
- v++;
- ans = rmq(u - 1, v - 1);
- }
- System.out.print(u + " " + v + " " + ans);
- }
- private static void fillLogs(int n) {
- logs[1] = 0;
- int start = 1;
- int toPush = 0;
- while (true) {
- int i = start;
- for (; i < start * 2 && i < n; i++) {
- logs[i] = toPush;
- }
- if (i >= n) break;
- start <<= 1;
- toPush++;
- }
- }
- private static int rmq(int i, int j) {
- if (i > j) {
- int t = j;
- j = i;
- i = t;
- }
- int k = logs[j - i + 1];
- return Math.min(st[k][i], st[k][(int) (j - Math.pow(2, k) + 1)]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement