Advertisement
Guest User

Untitled

a guest
Feb 27th, 2020
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.41 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. if (a > b) {
  7. return gcd(a - b, b);
  8. } else if (a < b) {
  9. return gcd(a, b - a);
  10. } else
  11. return a;
  12.  
  13. }
  14.  
  15. void SparseTable_Build(int *D, int** ST, int n) {
  16. int m = log2(n) + 1;
  17. int i = 0;
  18. while (i < n) {
  19. ST[i][0] = abs(D[i]);
  20. i++;
  21. }
  22. int j = 1;
  23. int x = 1;
  24. while (j < m) {
  25. i = 0;
  26. x *= 2;
  27. while (i <= n - x) {
  28. int y = x / 2;
  29. ST[i][j] = gcd(ST[i][j - 1], ST[i + y][j - 1]);
  30. i++;
  31. }
  32. j++;
  33. }
  34. }
  35.  
  36. int SparseTable_Query(int** ST, int l, int r) {
  37. int j = log2(r - l + 1);
  38. int p = pow(2, j);
  39. return gcd(ST[l][j], ST[r - p + 1][j]);
  40. }
  41.  
  42. int main()
  43. {
  44. int n;
  45. scanf("%d", &n);
  46. int* D = (int*)malloc(n*sizeof(int));
  47. for (int i = 0; i < n; i++)
  48. scanf("%d", &D[i]);
  49. int b = log2(n) + 1;
  50. int** ST = (int**)calloc(n, sizeof(int*));
  51. for (int i = 0; i < n; i++)
  52. ST[i] = (int*)calloc(b, sizeof(int));
  53. SparseTable_Build(D, ST, n);
  54. int m;
  55. scanf("%d", &m);
  56. for (int i = 0; i < m; i++) {
  57. int l, r;
  58. scanf("%d%d", &l, &r);
  59. printf("%d\n", SparseTable_Query(ST, l, r));
  60. }
  61. for (int i = 0; i < n; i++)
  62. free(ST[i]);
  63. free(ST);
  64. free(D);
  65. return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement