Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- int *logs(int m) //log_table
- {
- int cap = pow(2, m);
- int *lg = (int *) calloc (cap, sizeof(int));
- int i = 1, j = 0;
- while (i < m)
- {
- while (j < cap)
- {
- lg[j] = i - 1;
- j++;
- }
- i++;
- }
- return lg;
- }
- int *st_build(int *p, int n, int *lg) //sparse_table create
- {
- int m = lg[n] + 1;
- int st[n][m];
- int i = 0;
- while (i < n)
- {
- st[i][0] = p[i];
- i++;
- }
- int j = 1;
- while (j < m)
- {
- i = 0;
- while (i <= n - pow(2, j))
- {
- st[i][j] = gcd(st[i][pow(2, j)], st[i + pow(2, j - 1)][j - 1]);
- i++;
- }
- j++;
- }
- return st;
- }
- int gcd(int a, int b) //gcd
- {
- if (a < 0 || b < 0) return (a < 0) ? b : a;
- if (a == 0 || b == 0) return (a == 0) ? b : a;
- if (a < b)
- {
- int t = a;
- a = b;
- b = t;
- }
- while(b > 0)
- {
- int t = a % b;
- a = b;
- b = t;
- }
- return a;
- }
- st_query(int *st, int l, int r, int *logs) //sparse_table query
- {
- int j = logs[r - l + 1];
- int v = gcd(st[l][j], st[r - pow(2, j) + 1][j]);
- }
- int main(int argc, char **argv)
- {
- int N = 0;
- scanf("%lu", &N);
- int *array = (int *) malloc(N * sizeof(int));
- int *lg = logs(N);
- for (int i = 0; i < N; i++)
- scanf("%d ", &array[i]);
- int K;
- scanf("%d\n", &K);
- for (int i = 0; i < K; i++)
- {
- int l, r;
- scanf("%d %d", &l, &r);
- int *st = st_build(array, N, lg);
- printf("%d\n", st_query(st, l, r, lg));
- }
- free(lg);
- free(array);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement