Advertisement
siiena

rangemax

Feb 20th, 2020
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4.  
  5. int t[4 * 1000000];
  6.  
  7. int max(int a, int b) {
  8.   if (a >= b) {
  9.     return a;
  10.   }
  11.   else {
  12.     return b;
  13.   }
  14. }
  15.  
  16. int min(int a, int b) {
  17.   if (a <= b) {
  18.     return a;
  19.   }
  20.   else {
  21.     return b;
  22.   }
  23. }
  24.  
  25. void build (int a[], int v, int tl, int tr) {
  26.     if (tl == tr)
  27.         t[v] = a[tl];
  28.     else {
  29.         int tm = (tl + tr) / 2;
  30.         build (a, v * 2, tl, tm);
  31.         build (a, v * 2 + 1, tm + 1, tr);
  32.         t[v] = max(t[v * 2], t[v * 2 + 1]);
  33.     }
  34. }
  35.  
  36. int maximum (int v, int tl, int tr, int l, int r) {
  37.     if (l > r)
  38.         return -1e9 - 1;
  39.     if (l == tl && r == tr)
  40.         return t[v];
  41.     int tm = (tl + tr) / 2;
  42.     return max(maximum(v * 2, tl, tm, l, min(r, tm)), maximum(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r));
  43. }
  44.  
  45. void update (int v, int tl, int tr, int pos, int new_val) {
  46.     if (tl == tr)
  47.         t[v] = new_val;
  48.     else {
  49.         int tm = (tl + tr) / 2;
  50.         if (pos <= tm)
  51.             update (v * 2, tl, tm, pos, new_val);
  52.         else
  53.             update (v * 2 + 1, tm + 1, tr, pos, new_val);
  54.         t[v] = max(t[v * 2], t[v * 2 + 1]);
  55.     }
  56. }
  57.  
  58. int main()
  59. {
  60.         int n, k;
  61.         scanf("%d", &n);
  62.         int *a;
  63.         a = (int*)malloc(n * sizeof(int));
  64.         for (int i = 0; i < n; i++) {
  65.                 scanf("%d", &a[i]);
  66.         }
  67.         scanf("%d", &k);
  68.         build(a, 1, 0, n - 1);
  69.         for (int i = 0; i < k; i++) {
  70.                 char str[20];
  71.                 char maxx[] = "MAX";
  72.                 int l, r;
  73.                 scanf("%s%d%d", &str, &l, &r);
  74.                 if (strcmp(str, maxx) == 0) {
  75.                         printf("%d\n", maximum(1, 0, n - 1, l, r));
  76.                 }
  77.                 else {
  78.                         update(1, 0 , n - 1, l, r);
  79.                 }
  80.         }
  81.         free(a);
  82.           return 0;
  83. }
  84.  
  85. ____________________________________________________________________________________________________________________________
  86.  
  87.  
  88. Поиск максимального элемента подпоследовательности
  89.  
  90. Составьте программу rangemax.c, выполняющую поиск максимального элемента на различных интервалах последовательности целых чисел, которая время от времени изменяется.
  91.  
  92. Формат входных данных
  93. Первая строка, считываемая со стандартного потока ввода, содержит размер последовательности n (0 < n ≤ 1000000). Во второй строке перечислены элементы последовательности. Каждый элемент представляет собой целое число, находящееся в диапазоне от -109 до 109. Элементы разделяются пробелами.
  94. Третья строка содержит общее количество выполняемых операций m (0 < m ≤ 20000). Каждая из следующих m строк содержит описание операции.
  95. Операция либо имеет форму MAX l r (найти максимальный элемент подпоследовательности, начинающейся с элемента с индексом l и заканчивающейся элементом с индексом r), либо форму UPD i v (присвоить значение v элементу с индексом i).
  96. Формат результата работы программы
  97. Для каждой операции MAX вывести в стандартный поток вывода значение максимального элемента указанной подпоследовательности.
  98. Пример работы программы
  99.  
  100. Ввод:
  101. 5
  102. 10 2 -5 8 7
  103. 4
  104. MAX 0 4
  105. MAX 1 3
  106. UPD 2 12
  107. MAX 1 3
  108. Выод:
  109. 10
  110. 8
  111. 12
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement