Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <limits.h>
- int max(int a, int b)
- {
- return a > b ? a : b;
- }
- void buildTree(int* C, int N)
- {
- for (int i = N - 1; i > 0; --i)
- {
- C[i] = max(C[2 * i ], C[2 * i + 1]);
- }
- }
- void update(int* C, int N, int index, int newValue)
- {
- index += N;
- C[index] = newValue;
- for (int parentIndex = index / 2; parentIndex != 0; parentIndex /= 2)
- {
- C[parentIndex] = max(C[2 * parentIndex], C[2 * parentIndex + 1]);
- }
- }
- int queryMax(int* C, int N, int l, int r)
- {
- l += N;
- r += N;
- int answer = INT_MIN;
- while (l <= r)
- {
- if (l % 2 == 1)
- answer = max(answer, C[l]);
- if (r % 2 == 0)
- answer = max(answer, C[r]);
- l = (l + 1) / 2;
- r = (r - 1) / 2;
- }
- return answer;
- }
- int main()
- {
- int n; // кол-во элементов
- int N; // ближайшая степень двойки, не меньшая n
- scanf("%d", &n);
- N = 1;
- while (N < n)
- N *= 2;
- int* container = (int*)malloc((2 * N)*sizeof(int));
- int i;
- for (i = N; i < N + n; ++i)
- scanf("%d", &container[i]);
- for (; i < 2 * N; ++i)
- container[i] = INT_MIN;
- buildTree(container, N);
- // for (int i = 0; i < 2 * N; ++i)
- // printf("%d ", container[i]);
- int m;
- scanf("%d", &m);
- for (int i = 0; i < m; ++i)
- {
- char command[4];
- scanf("%s", command);
- if (command[0] == 'M')
- {
- int l, r;
- scanf("%d%d", &l, &r);
- int answer = queryMax(container, N, l, r);
- printf("%d\n", answer);
- }
- else
- {
- int index, newValue;
- scanf("%d%d", &index, &newValue);
- update(container, N, index, newValue);
- }
- }
- free(container);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement