Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int gcd(int x, int y)
  5. {
  6.     int z;
  7.     while (abs(y) > 0)
  8.     {
  9.         z = x % y;
  10.         x = y;
  11.         y = z;
  12.     }
  13.     return abs(x);
  14. }
  15.  
  16. void computelog(int* lg, int m)
  17. {
  18.     int i = 1, j = 0;
  19.     while (i < m)
  20.     {
  21.         while (j < (1 << i))
  22.         {
  23.             lg[j] = i - 1;
  24.             j++;
  25.         }
  26.         i++;
  27.     }
  28. }
  29.  
  30. void sparse_table_build(int* a, int n, int h, int** st)
  31. {
  32.     int i = 0;
  33.     while (i < n)
  34.     {
  35.         st[i][0] = a[i];
  36.         i++;
  37.     }
  38.     int j = 1;
  39.     while (j < h)
  40.     {
  41.         i = 0;
  42.         while (i <= n - (1 << j))
  43.         {
  44.             st[i][j] = gcd(st[i][j-1], st[i + (1 << (j - 1))][j-1]);
  45.             i++;
  46.         }
  47.         j++;
  48.     }
  49. }
  50.  
  51. int sparse_table_query(int** st, int l, int r, int* lg)
  52. {
  53.     int j = lg[r - l + 1];
  54.     int v = gcd(st[l][j], st[r - (1 << j) + 1][j]);
  55.     return v;
  56. }
  57.  
  58. int main()
  59. {
  60.     int n;
  61.     scanf("%d", &n);
  62.     int* a = (int*)calloc(n, sizeof(int));
  63.     for (int i = 0; i < n; ++i)
  64.         scanf("%d", &a[i]);
  65.     int* lg = (int*)calloc(1000000, sizeof(int));
  66.     computelog(lg, 20);
  67.     int h = lg[n] + 1;
  68.     int ** st = (int**)malloc(n * sizeof(int*));
  69.     for (int i = 0; i < n; ++i)
  70.         st[i] = (int*)calloc(h, sizeof(int));
  71.     sparse_table_build(a, n, h, st);
  72.     int m, l, r;
  73.     scanf("%d", &m);
  74.     for (int i = 0; i < m; ++i)
  75.     {
  76.         scanf("%d%d", &l, &r);
  77.         printf("%d\n", sparse_table_query(st, l, r, lg));
  78.     }
  79.     for (int i = 0; i < n; ++i)
  80.         free(st[i]);
  81.     free(st);
  82.     free(a);
  83.     free(lg);
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement