Advertisement
Guest User

Untitled

a guest
Feb 19th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.82 KB | None | 0 0
  1. //19
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. void sparsetable_Build(int * arr, int n, int * lg, int ** array)
  7. {
  8.         int m = lg[n] + 1, i = 0, j = 1;
  9.     while(i < n){
  10.         array[i][0] = arr[i];
  11.         i++;
  12.     }
  13.     while(j < m){
  14.         i = 0;
  15.         while(i <= n- (1 << j)){
  16.             array[i][j] = GCD(array[i][j - 1], array[i + (1 << (j - 1))][j - 1]);
  17.             i++;
  18.         }
  19.         j++;
  20.     }
  21. }
  22.  
  23. int computelLogarithms(int m)
  24. {
  25.     int *lg = malloc((1 << m) * sizeof(int));
  26.     int i = 1, j = 0;
  27.     while(i <= m){
  28.         while(j < (1 << i)){
  29.             lg[j] = i - 1;
  30.             j++;
  31.         }
  32.         i++;
  33.     }
  34.     return lg;
  35. }
  36.  
  37. int sparseTable_Query(int ** array, int l, int r, int * lg)
  38. {
  39.     int j = lg[r - l + 1];
  40.     return GCD(array[l][j], array[r - (1<<j) + 1][j]);
  41. }
  42.  
  43. int GCD(int a, int b)
  44. {
  45.     if (b == 0)
  46.         return a;
  47.     else
  48.         return GCD(b, a % b);
  49. }
  50.  
  51. void kill(int *array1)
  52. {
  53.     free(array1);
  54. }
  55.  
  56. int main()
  57. {
  58.     int n, times, l, r;
  59.     scanf("%d", &n);
  60.     int *arr = malloc(n * sizeof(int));
  61.     int **array = malloc(n * sizeof (int *));
  62.     int x = log2(n) + 1;
  63.     for (int i = 0; i < n; i++){
  64.         scanf("%d", &arr[i]);
  65.     }
  66.     for (int i = 0; i < n; i++){
  67.         array[i] = malloc(x * sizeof(int));
  68.     }
  69.     int array1 = computelLogarithms(x);
  70.     sparsetable_Build(arr, n, array1, array);
  71.     scanf("%d", &times);
  72.     for (; times > 0; times--){
  73.         scanf("%d %d", &l, &r);
  74.         printf("%d \n", abs(sparseTable_Query(array, l, r, array1)));
  75.     }
  76.     for (int i = 0; i < n; i++){
  77.         free(array[i]);
  78.     }
  79.     free (arr);
  80.     free (array);
  81.     kill(array1);
  82. }
  83.  
  84. //19
  85.  
  86. #include <stdio.h>
  87. #include <stdlib.h>
  88. #include <string.h>
  89.  
  90. #define PEAK "PEAK"
  91.  
  92. int peak (int *arr, int i,int j, int n)
  93. {
  94.     int count = 0;
  95.     if (n == 1){
  96.             return 1;
  97.     }
  98.     while (i<=j) {
  99.         if (((i == 0) && (arr[i] >= arr[i + 1])) || ((i == n - 1) && (arr[i] >= arr[i - 1]))) {
  100.             count++;
  101.         }
  102.         if (i != 0 && i != n - 1 && arr[i - 1] <= arr[i] && arr[i + 1] <= arr[i]) {
  103.             count++;
  104.         }
  105.         i++;
  106.     }
  107.     return count;
  108. }
  109.  
  110. int query(int l, int r, int i, int a, int b, int *T)
  111. {
  112.     if  (l == a && r == b){
  113.         return T[i];
  114.     }else{
  115.         int m = (a+b)/2;
  116.         if (r <= m){
  117.             return query(l, r, 2*i+1, a, m, T);
  118.         }else{
  119.             if (l > m){
  120.                 return query(l, r, 2*i+2, m+1, b, T);
  121.             }else{
  122.                 return query(m+1, r, 2*i+2, m+1, b, T) + query(l, m, 2*i+1, a, m, T);
  123.             }
  124.         }
  125.     }
  126. }
  127.  
  128. void build(int *arr, int i, int n, int a, int b, int *T)
  129. {
  130.     if (a == b) {
  131.         T[i] = peak(arr, a, b, n);
  132.     }else{
  133.         int m = (a+b)/2;
  134.         build(arr, 2*i + 1, n, a, m, T);
  135.         build(arr, 2*i + 2, n, m+1, b, T);
  136.         T[i] = T[2*i + 2] + T[2*i+1];
  137.     }
  138. }
  139.  
  140.  
  141. void update(int *arr, int j, int val, int i, int a, int b, int *T, int n)
  142. {
  143.     if (a == b)
  144.         T[i] = peak(arr, a, b, n);
  145.     else {
  146.         int m = (a+b)/2;
  147.         if (j <= m) {
  148.             update(arr, j, val, 2*i+1, a, m, T, n);
  149.         }else{
  150.             update(arr, j, val, 2*i+2, m+1, b, T, n);
  151.         }
  152.         T[i] = T[2*i + 2] + T[2*i+1];
  153.     }
  154. }
  155.  
  156. int main()
  157. {
  158.     int n, l, r, times;
  159.     scanf("%d", &n);
  160.     int *arr = malloc(n * sizeof(int));
  161.     int *T = calloc(4*n, sizeof(int));
  162.     for (int i = 0; i < n; i++){
  163.         scanf("%d", &arr[i]);
  164.     }
  165.     build (arr, 0, n, 0, n-1, T);
  166.     scanf("%d", &times);
  167.     char s[5];
  168.     for (int i = 0; i < times; i++) {
  169.         scanf("%s", &s);
  170.         if (strcmp(s, PEAK) == 0) {
  171.             scanf("%d%d", &l, &r);
  172.             printf ("%d\n", query(l, r, 0, 0, n-1, T));
  173.         }else{
  174.             scanf("%d%d", &l, &r);
  175.             arr[l] = r;
  176.             update(arr, l, r, 0, 0, n-1, T, n);
  177.             if (l!=0) update(arr, l-1, r, 0, 0, n-1, T, n);
  178.             if (l!=n-1) update(arr, l+1, r, 0, 0, n-1, T, n);
  179.         }
  180.     }
  181.     free(arr);
  182.     free(T);
  183. }
  184.  
  185. //17
  186.  
  187. #include <stdio.h>
  188. #include <stdlib.h>
  189. #include <string.h>
  190.  
  191. #define MAX "MAX"
  192.  
  193. int query(int l, int r, int i, int a, int b, int *T)
  194. {
  195.     int m = 0;
  196.     if  (l == a && r == b){
  197.         return T[i];
  198.     }else{
  199.         m = (a+b)/2;
  200.         if (r <= m){
  201.             return query(l, r, 2*i+1, a, m, T);
  202.         }
  203.         if (l > m){
  204.             return query(l, r, 2*i+2, m+1, b, T);
  205.         }
  206.         if (query(l, m, 2*i+1, a, m, T) > query(m + 1, r, 2*i+2, m + 1, b, T)){
  207.             return query(l, m, 2*i+1, a, m, T);
  208.         }else{
  209.             return query(m + 1, r, 2*i+2, m + 1, b, T);
  210.         }
  211.     }
  212. }
  213.  
  214. void build(int *arr, int i, int a, int b, int *T)
  215. {
  216.     if (a == b) {
  217.         T[i] = arr[a];
  218.     }else{
  219.         int m = (a+b)/2;
  220.         build(arr, 2*i + 1, a, m, T);
  221.         build(arr, 2*i + 2, m+1, b, T);
  222.         if(T[2*i + 1] > T[2*i + 2]){
  223.                 T[i] = T[2*i + 1];
  224.         }else{
  225.             T[i] = T[2*i + 2];
  226.         }
  227.     }
  228. }
  229.  
  230.  
  231. void update(int j, int val, int i, int a, int b, int *T)
  232. {
  233.     int m = 0;
  234.     if (a == b)
  235.         T[i] = val;
  236.     else {
  237.         m = (a+b)/2;
  238.         if (j <= m) {
  239.             update(j, val, 2*i+1, a, m, T);
  240.         }else{
  241.             update(j, val, 2*i+2,m+1, b, T);
  242.         }
  243.         if(T[2*i + 1] > T[2*i + 2]){
  244.             T[i] = T[2*i + 1];
  245.         }else{
  246.             T[i] = T[2*i + 2];
  247.         }
  248.     }
  249. }
  250.  
  251. int main()
  252. {
  253.     int n, l, r, times;
  254.     scanf("%d", &n);
  255.     int *arr = malloc(n * sizeof(int));
  256.     int *T = malloc(4*n * sizeof(int));
  257.     for (int i = 0; i < n; i++){
  258.         scanf("%d", &arr[i]);
  259.     }
  260.     build(arr, 0, 0, n-1, T);
  261.     scanf("%d", &times);
  262.     char s[4];
  263.     for (int i = 0; i < times; i++) {
  264.         scanf("%s", s);
  265.         if (strcmp(s, MAX) == 0) {
  266.             scanf("%d %d", &l, &r);
  267.             printf ("%d\n", query(l, r, 0, 0, n-1, T));
  268.         }else{
  269.             scanf("%d %d", &l, &r);
  270.             update(l, r, 0, 0, n-1, T);
  271.         }
  272.     }
  273.     free(arr);
  274.     free(T);
  275. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement