Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- int *numbers, *lg,ST[300000][100];
- int GCD(int a,int b) {
- return abs(b?GCD(b,a%b):a);
- }
- int myPow(int a)
- {
- return 1 << a;
- }
- void ComputeLogarithms(int m, int* lg)
- {
- int i =1, j = 0;
- while (i <= m)
- {
- while (j < myPow(i))
- {
- lg[j] = i - 1;
- j++;
- }
- i++;
- }
- }
- //n - размер numbers
- //numbers - оригинальная последовательность
- void Table_Build(int n)
- {
- int m = lg[n]+ 1, i = 0, j = 1;
- while (i < n) {
- ST[i][0] = numbers[i];
- i++;
- }
- j = 1;
- while(j < m)
- {
- i = 0;
- while(i <= n - myPow(j)){
- ST[i][j] = GCD(ST[i][j-1], ST[i + myPow(j - 1) ][j-1]);
- i++;
- }
- j++;
- }
- }
- int Table_Query(int l, int r)
- {
- int j = lg[r - l + 1];
- //printf("j = %d", j);
- return GCD(ST[l][j], ST[r - myPow(j) + 1 ][j]);
- }
- int main(int argc, const char * argv[]) {
- int i, n, m, k , a, b;
- scanf("%d",&n);
- numbers = (int *)malloc(n *sizeof(int));
- for (i = 0 ; i < n; i++)
- scanf("%d", &numbers[i]);
- k = log2(n)+ 1 ;
- lg = (int*)malloc((myPow(k) + 1)* sizeof(int));
- ComputeLogarithms(k , lg);
- Table_Build(n);
- scanf("%d", &m);
- for (i = 0; i < m; i++) {
- scanf("%d%d", &a, &b);
- printf("%d\n",Table_Query(a, b));
- }
- free(numbers);
- free(lg);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement