Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- int query(int* tree, int l, int r, int a, int b, int i);
- int max(int x, int y);
- void build(int* arr, int i, int a, int b, int* tree);
- void update(int i, int v, int val, int a, int b, int* tree);
- int max(int x, int y){
- return (y>x) ? y : x;
- }
- void build(int* arr, int i, int a, int b, int* tree){
- if (a==b) tree[i]=arr[a];
- else{
- int m=a+(b-a)/2;
- build(arr, 2*i+1, a, m, tree);
- build(arr, 2*i+2, m+1, b, tree);
- tree[i]=max(tree[2*i+1], tree[2*i+2]);
- }
- }
- void update(int i, int v, int val, int a, int b, int* tree){
- if (a==b) tree[v]=val;
- else {
- int m=a+(b-a)/2;
- if (i<=m) update(i, 2*v+1, val, a, m, tree);
- else update(i, 2*v+2, val, m+1, b, tree);
- tree[v]=max(tree[2*v+1], tree[2*v+2]);
- }
- }
- int query(int* tree, int l, int r, int a, int b, int i){
- if ((l==a) && (r==b)) return tree[i];
- else {
- int m=a+(b-a)/2;
- if (r<=m) return query(tree, l, r, a, m, 2*i+1);
- else{
- if (l>m) return query(tree, l, r, m+1, b, 2*i+2);
- else return max(query(tree, l, m, a, m, 2*i+1), query(tree, m+1, r, m+1, b, 2*i+2));
- }
- }
- }
- int main(int argc, char** argv){
- int n, k, x, y;
- char str[3];
- scanf("%d", &n);
- int* arr=(int*)malloc(n*sizeof(int));
- for (int i=0; i<n; i++) scanf("%d", &arr[i]);
- int* tree=(int*)malloc(4*n*sizeof(int));
- build(arr, 0, 0, n-1, tree);
- scanf("%d", &k);
- for (int i=0; i<k; i++){
- for (int j=0;j<3; j++) scanf(" %c", &str[j]);
- scanf("%d%d", &x, &y);
- if (str[0]==77) printf("%d\n", query(tree, x, y, 0, n-1, 0));
- else update(x,0, y, 0, n-1, tree);
- }
- free(arr);
- free(tree);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement