Advertisement
Guest User

Untitled

a guest
Dec 1st, 2015
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.58 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. int gcd(int a, int b)
  6. {
  7.         if (b == 0)
  8.                 return abs(a);
  9.         else return abs(gcd(b, a % b));
  10. }
  11.  
  12. void ComputeLogarithms(int m, int *lg)
  13. {
  14.         int i=1, j=0;
  15.         for(; i <= m; i++)
  16.                 for(; j< pow(2,i); j++)
  17.                         lg[j]= i - 1;
  18. }
  19.  
  20. int ST_Query(int **ST, int l, int r, int *lg)
  21. {
  22.         int j=lg[r-l+1];
  23.         return gcd(ST[l][j], ST[r-(1 << j)+1][j]);
  24. }      
  25.  
  26. void ST_Build(int *v, int **ST, int *lg, int n, int m)
  27. {
  28.         int i=0, j=1;
  29.         for (; i < n; i++)
  30.                 ST[i][0]=v[i];
  31.         for (; j < m; j++)
  32.                 for (i = 0; i <= n -(1 << j); i++)
  33.                         ST[i][j] = gcd(ST[i][j - 1], ST[i + (1 << (j-1))][j - 1]);
  34. }
  35.  
  36. int main()
  37. {
  38.         int i, n, k;
  39.         scanf("%d", &n);
  40.         int *a=(int*)malloc((n+1)*sizeof(int));
  41.         for (i = 0; i < n; i++)
  42.                 scanf("%d", &a[i]);
  43.         int **ST=(int**)malloc((n+1)*sizeof(int*));
  44.         int  m= log2(n)+1;
  45.         for (i = 0; i < n; i++)
  46.                 ST[i] = calloc(m, sizeof(int));
  47.     int *lg =(int*)malloc(pow(2,((int) m+1))*sizeof(int));
  48.         ComputeLogarithms(m,lg);
  49.         scanf("%d", &k);
  50.     ST_Build(a, ST, lg, n, m);
  51.         int l, r;
  52.         while(k>0){
  53.                 scanf("%d %d", &l, &r);
  54.                 printf("%d\n", ST_Query(ST, l, r, lg));
  55.                 k--;
  56.         }
  57.  
  58.         for (i = 0; i < n; ++i)
  59.                 free(ST[i]);
  60.     free(ST);
  61.         free(a);
  62.         free(lg);
  63.         return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement