Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int Max(int x, int y)
- {
- return x > y ? x : y;
- }
- void build(int *a, int *tree, int cur, int left, int right)
- {
- if (left == right)
- tree[cur] = a[left];
- else
- {
- int mid = (left + right) / 2;
- build(a, tree, cur * 2, left, mid);
- build(a, tree, cur * 2 + 1, mid + 1, right);
- tree[cur] = Max(tree[cur * 2], tree[cur * 2 + 1]);
- }
- }
- int query(int *tree, int cur, int left, int right, int l, int r)
- {
- if (l > r)
- return 0;
- if (l == left && r == right)
- return tree[cur];
- else
- {
- int mid = (left + right) / 2;
- if (right <= mid)
- return query(tree, cur * 2, left, right, l, mid);
- else if (left > mid)
- return query(tree, cur * 2 + 1, left, right, mid + 1, r);
- return Max(query(tree, cur * 2, left, mid, l, mid), query(tree, cur * 2 + 1, mid + 1, right, mid + 1, r));
- }
- }
- void update(int *tree, int cur, int left, int right, int pos, int new_val)
- {
- if (left == right)
- tree[cur] = new_val;
- else
- {
- int mid = (left + right) / 2;
- if (pos <= mid)
- update(tree, cur * 2, left, mid, pos, new_val);
- else
- update(tree, cur * 2 + 1, mid + 1, right, pos, new_val);
- tree[cur] = Max(tree[cur * 2], tree[cur * 2 + 1]);
- }
- }
- int main()
- {
- int i, n, k;
- int left, right, cur, val;
- scanf("%d", &n);
- int *a = calloc(n, sizeof(int));
- int *tree = calloc(4 * n, sizeof(int));
- char buf[4];
- for (i = 0; i < n; i++)
- scanf("%d", &a[i]);
- scanf("%d", &k);
- for (i = 0; i < k; i++)
- {
- //gets(buf);
- scanf("%s ", buf);
- build(a, tree, 1, 0, n - 1);
- if (strcmp(buf, "MAX") == 0)
- {
- scanf("%d %d", &left, &right);
- printf("%d\n", query(tree, 1, left, right, 0, n - 1));
- }
- else
- {
- scanf("%d %d", &cur, &val
- );
- update(tree, cur, 0, n - 1, 1, val);
- }
- }
- free(a);
- free(tree);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement