Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.13 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void update(int j, int v, int i, int a, int b, int T[]) {
  6.     int l;
  7.     if (a == b) {
  8.         T[i] = v;
  9.     } else { //также взято из лекции
  10.         l = ((a+b)/2);//доработан только последний  IF В связи с немного другой задачей условия
  11.         if (j <= l) {
  12.             update(j, v, 2*i, a, l, T);
  13.         }
  14.         else {
  15.             update(j, v, 2*i + 1, l + 1, b, T);
  16.         }
  17.         if (T[2*i] > T[2*i + 1]){
  18.             T[i] = T[2*i];
  19.         } else {
  20.             T[i] = T[2*i + 1];
  21.         }
  22.     }
  23. }
  24.  
  25. int query(int T[],  int j, int t, int i, int a, int b) {
  26.     int v, l; //данный алгоритм полностью списан из лекции с небольшими доработками
  27.     if ((j == a) && (t == b)) { //переживать за плагиат не стоит, так как код +- будет у всех одинаковый
  28.         v = T[i];
  29.     } else {
  30.         l = ((a+b)/2);
  31.         if (t <= l) {
  32.             v = query(T, j, t, 2*i, a, l);
  33.         }
  34.         else if (j > l){
  35.             v = query(T, j, t, 2*i + 1, l + 1, b);
  36.         }
  37.         else {
  38.             if (query(T, j, l, 2*i, a, l) > query(T, l + 1, t, 2*i + 1, l + 1, b)) {
  39.                 v = query(T, j, l, 2*i, a, l);
  40.             } else {
  41.                 v = query(T, l + 1, t, 2*i + 1, l + 1, b);
  42.             }
  43.         }
  44.     }
  45.     return v;
  46. }
  47.  
  48. void build(int array[], int i, int a, int b, int T[]) {
  49.     int l;
  50.     if (a == b){
  51.         T[i] = array[a];
  52.     } else {
  53.         l = ((a+b)/2);
  54.         build (array, 2*i, a, l, T); //рекурсивно строится дерево с каждой рекурсией на выходе получаем по лепестку
  55.         build (array, 2*i + 1, l + 1, b, T);
  56.         if (T[2*i] > T[2*i + 1]) {
  57.             T[i] = T[2*i];
  58.         } else {
  59.             T[i] = T[2*i + 1];
  60.         }
  61.     }
  62. }
  63.  
  64. int main()
  65. {
  66.     int n, k, i, j, v, *array,  *T;
  67.     char command[4];
  68.     scanf("%d", &n); //считавание размера массива
  69.     array = (int*)malloc(n * sizeof(int)); //выделение памяти
  70.     for (i = 0; i < n; i++)
  71.         scanf("%d", &array[i]); //считывание массива
  72.     scanf("%d", &k); //кол-во команд
  73.     T = (int*)malloc(4 * n * sizeof(int)); //выделение нового массива
  74.     for(i = 0; i < 4*n; i++)
  75.         T[i] = 0;
  76.     build(array, 1, 0, (n-1), T); //по лекциям можно найти алгоритм этот, используется для построения дерева
  77.     for(i = 0; i < k; i++)
  78.     {
  79.         scanf("%s %d %d", &command, &j, &v); //считываем команду
  80.         if (strcmp(command, "MAX") == 0)
  81.             printf("%d ", query(T, j, v, 1, 0, n-1)); //команда для нахождения макс числа
  82.         if (strcmp(command, "UPD") == 0)
  83.             update(j, v, 1, 0, n-1, T);//команда для обновления эл-та
  84.     }
  85.     free(array);
  86.     free(T);
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement