Advertisement
Guest User

Untitled

a guest
Dec 1st, 2015
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.64 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4.  
  5. int max(int a, int b)
  6. {
  7.     return a > b ? a : b;
  8. }
  9.  
  10. void buildTree(int* C, int N)
  11. {
  12.     for (int i = N - 1; i > 0; --i)
  13.     {
  14.         C[i] = max(C[2 * i ], C[2 * i + 1]);
  15.     }
  16. }
  17.  
  18. void update(int* C, int N, int index, int newValue)
  19. {
  20.     index += N;
  21.  
  22.     C[index] = newValue;
  23.  
  24.     for (int parentIndex = index / 2; parentIndex != 0; parentIndex /= 2)
  25.     {
  26.         C[parentIndex] = max(C[2 * parentIndex], C[2 * parentIndex + 1]);
  27.     }
  28. }
  29.  
  30. int queryMax(int* C, int N, int l, int r)
  31. {
  32.     l += N;
  33.     r += N;
  34.     int answer = INT_MIN;
  35.  
  36.     while (l <= r)
  37.     {
  38.         if (l % 2 == 1)
  39.             answer = max(answer, C[l]);
  40.         if (r % 2 == 0)
  41.             answer = max(answer, C[r]);
  42.  
  43.         l = (l + 1) / 2;
  44.         r = (r - 1) / 2;
  45.     }
  46.  
  47.     return answer;
  48. }
  49.  
  50. int main()
  51. {
  52.     int n; // кол-во элементов
  53.     int N; // ближайшая степень двойки, не меньшая n
  54.  
  55.     scanf("%d", &n);
  56.     N = 1;
  57.     while (N < n)
  58.         N *= 2;
  59.  
  60.     int* container = (int*)malloc((2 * N)*sizeof(int));
  61.  
  62.     int i;
  63.  
  64.     for (i = N; i < N + n; ++i)
  65.         scanf("%d", &container[i]);
  66.     for (; i < 2 * N; ++i)
  67.         container[i] = INT_MIN;
  68.  
  69.     buildTree(container, N);
  70.    
  71. //  for (int i = 0; i < 2 * N; ++i)
  72. //      printf("%d ", container[i]);
  73.  
  74.  
  75.     int m;
  76.     scanf("%d", &m);
  77.     for (int i = 0; i < m; ++i)
  78.     {
  79.         char command[4];
  80.         scanf("%s", command);
  81.  
  82.         if (command[0] == 'M')
  83.         {
  84.             int l, r;
  85.             scanf("%d%d", &l, &r);
  86.             int answer = queryMax(container, N, l, r);
  87.             printf("%d\n", answer);
  88.         }
  89.         else
  90.         {
  91.             int index, newValue;
  92.             scanf("%d%d", &index, &newValue);
  93.             update(container, N, index, newValue);
  94.         }
  95.     }
  96.  
  97.     free(container);
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement