Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void update(int j, int v, int i, int a, int b, int T[]) {
- int l;
- if (a == b) {
- T[i] = v;
- } else { //также взято из лекции
- l = ((a+b)/2);//доработан только последний IF В связи с немного другой задачей условия
- if (j <= l) {
- update(j, v, 2*i, a, l, T);
- }
- else {
- update(j, v, 2*i + 1, l + 1, b, T);
- }
- if (T[2*i] > T[2*i + 1]){
- T[i] = T[2*i];
- } else {
- T[i] = T[2*i + 1];
- }
- }
- }
- int query(int T[], int j, int t, int i, int a, int b) {
- int v, l; //данный алгоритм полностью списан из лекции с небольшими доработками
- if ((j == a) && (t == b)) { //переживать за плагиат не стоит, так как код +- будет у всех одинаковый
- v = T[i];
- } else {
- l = ((a+b)/2);
- if (t <= l) {
- v = query(T, j, t, 2*i, a, l);
- }
- else if (j > l){
- v = query(T, j, t, 2*i + 1, l + 1, b);
- }
- else {
- if (query(T, j, l, 2*i, a, l) > query(T, l + 1, t, 2*i + 1, l + 1, b)) {
- v = query(T, j, l, 2*i, a, l);
- } else {
- v = query(T, l + 1, t, 2*i + 1, l + 1, b);
- }
- }
- }
- return v;
- }
- void build(int array[], int i, int a, int b, int T[]) {
- int l;
- if (a == b){
- T[i] = array[a];
- } else {
- l = ((a+b)/2);
- build (array, 2*i, a, l, T); //рекурсивно строится дерево с каждой рекурсией на выходе получаем по лепестку
- build (array, 2*i + 1, l + 1, b, T);
- if (T[2*i] > T[2*i + 1]) {
- T[i] = T[2*i];
- } else {
- T[i] = T[2*i + 1];
- }
- }
- }
- int main()
- {
- int n, k, i, j, v, *array, *T;
- char command[4];
- scanf("%d", &n); //считавание размера массива
- array = (int*)malloc(n * sizeof(int)); //выделение памяти
- for (i = 0; i < n; i++)
- scanf("%d", &array[i]); //считывание массива
- scanf("%d", &k); //кол-во команд
- T = (int*)malloc(4 * n * sizeof(int)); //выделение нового массива
- for(i = 0; i < 4*n; i++)
- T[i] = 0;
- build(array, 1, 0, (n-1), T); //по лекциям можно найти алгоритм этот, используется для построения дерева
- for(i = 0; i < k; i++)
- {
- scanf("%s %d %d", &command, &j, &v); //считываем команду
- if (strcmp(command, "MAX") == 0)
- printf("%d ", query(T, j, v, 1, 0, n-1)); //команда для нахождения макс числа
- if (strcmp(command, "UPD") == 0)
- update(j, v, 1, 0, n-1, T);//команда для обновления эл-та
- }
- free(array);
- free(T);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement