Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.19 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define is_null(ptr)  \
  5. {  \
  6. if (ptr == NULL)  \
  7.     {  \
  8.         printf("[ERROR] Pointer at %s:%llu is NULL \n",__FILE__,__LINE__); \
  9.         exit(1);  \
  10.     }  \
  11. }
  12.  
  13. #define true 1
  14. #define false 0
  15.  
  16. typedef unsigned char byte;
  17. typedef byte bool;
  18.  
  19. #define GOLDEN_RATIO 1.61803398875
  20.  
  21. typedef int type;
  22.  
  23.  
  24. #define CREATE_VECTOR_TYPE_H(type)  \
  25. typedef struct vector_##type vector_##type; \
  26. typedef struct vector_##type { \
  27.     size_t size;  \
  28.     size_t size_mem; \
  29.     type* array; \
  30.     void (*push_back)(vector_##type* vec, const type elem); \
  31.     size_t (*length)(vector_##type* vec); \
  32.     void (*resize)(vector_##type* vec, const size_t size); \
  33.     void (*set)(vector_##type* vec, const size_t pos, type element); \
  34.     type* (*get)(vector_##type* vec, const size_t pos); \
  35.     void (*show)(vector_##type* vec,const char* specifier, bool debug); \
  36.     void (*clear)(vector_##type* vec); \
  37.     void (*delete)(vector_##type* vec); \
  38. }; \
  39. \
  40. void __vector_clear_##type(vector_##type* vec);  \
  41. void __vector_push_back_##type(vector_##type* vec, type element);  \
  42. void __vector_resize_##type(vector_##type* vec, const size_t size);  \
  43. void __vector_show_##type(vector_##type* vec, const char* specifier, bool debug);  \
  44. size_t __vector_length_##type(vector_##type* vec);  \
  45. type* __vector_get_##type(vector_##type* vec, const size_t pos);  \
  46. void __vector_set_##type(vector_##type* vec, const size_t pos, type element); \
  47. void __vector_delete_##type(vector_##type* vec); \
  48.  \
  49. vector_##type vector_##type##_create() \
  50. { \
  51.     vector_##type vec;  \
  52.      \
  53.     vec.size_mem = 0; \
  54.     vec.size = 0; \
  55.     vec.array = NULL; \
  56.      \
  57.     vec.push_back = __vector_push_back_##type; \
  58.     vec.length = __vector_length_##type; \
  59.     vec.resize = __vector_resize_##type; \
  60.     vec.get = __vector_get_##type; \
  61.     vec.set = __vector_set_##type; \
  62.     vec.show = __vector_show_##type; \
  63.     vec.clear = __vector_clear_##type; \
  64.     vec.delete = __vector_delete_##type; \
  65.     return vec; \
  66. } \
  67.  \
  68. void __vector_delete_##type(vector_##type* vec) \
  69. { \
  70.     if (vec->array) \
  71.         free(vec->array); \
  72.  \
  73.     vec->size_mem = 0; \
  74.     vec->size = 0; \
  75.     vec->array = NULL; \
  76. } \
  77.  \
  78. void __vector_clear_##type(vector_##type* vec) \
  79. { \
  80.     memset(vec->array, 0, sizeof(type)*(vec->size_mem)); \
  81. } \
  82.  \
  83. void __vector_push_back_##type(vector_##type* vec, type element) \
  84. { \
  85.     if (vec->size >= vec->size_mem) \
  86.     { \
  87.         vec->array = realloc(vec->array, sizeof(type) * (vec->size_mem + 1) * GOLDEN_RATIO); \
  88.     is_null(vec->array); \
  89.         memset(vec->array + vec->size_mem, 0 , ((vec->size_mem + 1) * GOLDEN_RATIO - vec->size_mem)*sizeof(type)); \
  90.          \
  91.     vec->size_mem = (vec->size_mem + 1) * GOLDEN_RATIO; \
  92.     } \
  93.     vec->array[vec->size++] = element; \
  94. } \
  95.  \
  96. void __vector_resize_##type(vector_##type* vec, const size_t size) \
  97. { \
  98.     if (size > vec->size_mem) { \
  99.     vec->array = realloc(vec->array, sizeof(type) * (size + 1) * GOLDEN_RATIO); \
  100.     is_null(vec->array); \
  101.     memset(vec->array + vec->size_mem, 0 , ((size + 1) * GOLDEN_RATIO - vec->size_mem)*sizeof(type)); \
  102.     vec->size_mem = (size + 1) * GOLDEN_RATIO; \
  103.     } \
  104.     vec->size = size; \
  105. } \
  106.  \
  107. void __vector_show_##type(vector_##type* vec, const char* specifier, bool debug) \
  108. { \
  109.     int i; \
  110.     size_t n = debug? vec->size_mem : vec->size; \
  111.     for (i = 0; i < n; i++) \
  112.     { \
  113.         printf(specifier,vec->array[i]); \
  114.     } \
  115.     printf(" \n"); \
  116. } \
  117.  \
  118. size_t __vector_length_##type(vector_##type* vec) \
  119. { \
  120.     return vec->size; \
  121. } \
  122.  \
  123. type* __vector_get_##type(vector_##type* vec, const size_t pos) \
  124. { \
  125.     if (pos < vec->size) \
  126.         return &vec->array[pos]; \
  127.  \
  128.     printf("[WARNING] Vector.get() %p: is out_of_range \n",vec); \
  129.     exit(-1); \
  130.     return NULL; \
  131. } \
  132.  \
  133. void __vector_set_##type(vector_##type* vec, const size_t pos, type element) \
  134. { \
  135.     if (pos < vec->size) \
  136.     { \
  137.         vec->array[pos] = element; \
  138.     } \
  139.     else \
  140.     { \
  141.         printf("[WARNING] Vector.set() %p: is out_of_range \n",vec);  \
  142.         exit(-1);  \
  143.     } \
  144. }
  145.  
  146.  
  147. CREATE_VECTOR_TYPE_H(ulong);
  148.  
  149.  
  150. #define swap(a,b) __swap(&a, &b)
  151. void __swap(ulong* a, ulong* b)
  152. {
  153.     ulong tmp = *a;
  154.     *a = *b;
  155.     *b = tmp;
  156. }
  157.  
  158. ulong gcd (ulong a, ulong b)
  159. {
  160.     while (b)
  161.     {
  162.         a %= b;
  163.         swap(a, b);
  164.     }
  165.     return a;
  166. }
  167.  
  168. int mylog(ulong value)
  169. {
  170.     int pos = 0;
  171.     while (value > 1)
  172.     {
  173.         pos++;
  174.         value >>= 1;
  175.     }
  176.     return pos;
  177. }
  178.  
  179. ulong sparse_table_query(ulong** table, size_t left, size_t right)
  180. {
  181.     ulong j = mylog(right - left + 1);
  182.     return gcd(table[left][j], table[right - (1 << j) + 1][j]);
  183. }
  184.  
  185. ulong** sparse_table_build(vector_ulong* vec)
  186. {
  187.     size_t m = mylog(vec->size) + 1;
  188.     ulong** table = malloc(vec->size * sizeof(ulong*));
  189.     size_t i;
  190.  
  191.     for (i = 0; i < vec->size; i++)
  192.     {
  193.         table[i] = malloc(m * sizeof(ulong));
  194.     }
  195.  
  196.     i = 0;
  197.     while (i < vec->size)
  198.     {
  199.         table[i][0] = vec->array[i];
  200.         i++;
  201.     }
  202.  
  203.     size_t j = 1;
  204.     size_t pow = 2;
  205.  
  206.     while (j < m)
  207.     {
  208.         i = 0;
  209.         while (i <= vec->size - pow)
  210.         {
  211.             table[i][j] = gcd (table[i][j - 1], table[i + (pow >> 1llu)][j - 1]);
  212.             i++;
  213.         }
  214.         j++;
  215.         pow <<= 1llu;
  216.     }
  217.  
  218.     return table;
  219. }
  220.  
  221. void sparse_table_free(ulong** table, size_t size)
  222. {
  223.     size_t i;
  224.     for (i = 0; i < size; i++)
  225.     {
  226.         free(table[i]);
  227.     }
  228.     free(table);
  229. }
  230.  
  231. int main(void)
  232. {
  233.     vector_ulong vec = vector_ulong_create();
  234.     int n;
  235.     scanf("%i", &n);
  236.  
  237.     vec.resize(&vec, n);
  238.  
  239.     int i;
  240.     long tmp;
  241.     for (i = 0; i < n; i++)
  242.     {
  243.         scanf("%lld", &tmp);
  244.         vec.array[i] = llabs(tmp);
  245.     }
  246.  
  247.     int count;
  248.     scanf("%i", &count);
  249.  
  250.     ulong** table = sparse_table_build(&vec);
  251.  
  252.     size_t left;
  253.     size_t right;
  254.  
  255.     for (i = 0; i < count; i++)
  256.     {
  257.         scanf("%llu %llu", &left, &right);
  258.         printf("%llu\n", sparse_table_query(table, left, right));
  259.     }
  260.  
  261.     sparse_table_free(table, vec.size);
  262.  
  263.     vec.delete(&vec);
  264.     return 0;
  265. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement