Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- int gcd(int x, int y)
- {
- int z;
- while (abs(y) > 0)
- {
- z = x % y;
- x = y;
- y = z;
- }
- return abs(x);
- }
- void computelog(int* lg, int m)
- {
- int i = 1, j = 0;
- while (i < m)
- {
- while (j < (1 << i))
- {
- lg[j] = i - 1;
- j++;
- }
- i++;
- }
- }
- void sparse_table_build(int* a, int n, int h, int** st)
- {
- int i = 0;
- while (i < n)
- {
- st[i][0] = a[i];
- i++;
- }
- int j = 1;
- while (j < h)
- {
- i = 0;
- while (i <= n - (1 << j))
- {
- st[i][j] = gcd(st[i][j-1], st[i + (1 << (j - 1))][j-1]);
- i++;
- }
- j++;
- }
- }
- int sparse_table_query(int** st, int l, int r, int* lg)
- {
- int j = lg[r - l + 1];
- int v = gcd(st[l][j], st[r - (1 << j) + 1][j]);
- return v;
- }
- int main()
- {
- int n;
- scanf("%d", &n);
- int* a = (int*)calloc(n, sizeof(int));
- for (int i = 0; i < n; ++i)
- scanf("%d", &a[i]);
- int* lg = (int*)calloc(1000000, sizeof(int));
- computelog(lg, 20);
- int h = lg[n] + 1;
- int ** st = (int**)malloc(n * sizeof(int*));
- for (int i = 0; i < n; ++i)
- st[i] = (int*)calloc(h, sizeof(int));
- sparse_table_build(a, n, h, st);
- int m, l, r;
- scanf("%d", &m);
- for (int i = 0; i < m; ++i)
- {
- scanf("%d%d", &l, &r);
- printf("%d\n", sparse_table_query(st, l, r, lg));
- }
- for (int i = 0; i < n; ++i)
- free(st[i]);
- free(st);
- free(a);
- free(lg);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement