Advertisement
Guest User

Untitled

a guest
Nov 26th, 2015
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.16 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int Max(int x, int y)
  6. {
  7.     return x > y ? x : y;
  8. }
  9.  
  10. void build(int *a, int *tree, int cur, int left, int right)
  11. {
  12.     if (left == right)
  13.         tree[cur] = a[left];
  14.     else
  15.     {
  16.         int mid = (left + right) / 2;
  17.         build(a, tree, cur * 2, left, mid);
  18.         build(a, tree, cur * 2 + 1, mid + 1, right);
  19.         tree[cur] = Max(tree[cur * 2], tree[cur * 2 + 1]);
  20.     }
  21. }
  22.  
  23. int query(int *tree, int cur, int left, int right, int l, int r)
  24. {
  25.     if (l > r)
  26.         return 0;
  27.  
  28.     if (l == left && r == right)
  29.         return tree[cur];
  30.  
  31.     else
  32.     {
  33.         int mid = (left + right) / 2;
  34.         if (right <= mid)
  35.             return query(tree, cur * 2, left, right, l, mid);
  36.         else if (left > mid)
  37.             return query(tree, cur * 2 + 1, left, right, mid + 1, r);
  38.         return Max(query(tree, cur * 2, left, mid, l, mid), query(tree, cur * 2 + 1, mid + 1, right, mid + 1, r));
  39.     }
  40. }
  41.  
  42. void update(int *tree, int cur, int left, int right, int pos, int new_val)
  43. {
  44.     if (left == right)
  45.         tree[cur] = new_val;
  46.     else
  47.     {
  48.         int mid = (left + right) / 2;
  49.         if (pos <= mid)
  50.             update(tree, cur * 2, left, mid, pos, new_val);
  51.         else
  52.             update(tree, cur * 2 + 1, mid + 1, right, pos, new_val);
  53.         tree[cur] = Max(tree[cur * 2], tree[cur * 2 + 1]);
  54.     }
  55. }
  56.  
  57. int main()
  58. {
  59.     int i, n, k;
  60.     int left, right, cur, val;
  61.     scanf("%d", &n);
  62.     int *a = calloc(n, sizeof(int));
  63.     int *tree = calloc(4 * n, sizeof(int));
  64.     char buf[4];
  65.  
  66.     for (i = 0; i < n; i++)
  67.         scanf("%d", &a[i]);
  68.  
  69.     scanf("%d", &k);
  70.     for (i = 0; i < k; i++)
  71.     {
  72.         //gets(buf);
  73.         scanf("%s ", buf);
  74.         build(a, tree, 1, 0, n - 1);
  75.         if (strcmp(buf, "MAX") == 0)
  76.         {
  77.             scanf("%d %d", &left, &right);
  78.             printf("%d\n", query(tree, 1, left, right, 0, n - 1));
  79.         }
  80.         else
  81.         {
  82.             scanf("%d %d", &cur, &val
  83.                   );
  84.             update(tree, cur, 0, n - 1, 1, val);
  85.         }
  86.     }
  87.     free(a);
  88.     free(tree);
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement