Cod sursa(job #2724774)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 17 martie 2021 19:53:23
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>

using namespace std;
FILE *f, *g;
int arb[100000 * 2 + 2];
int Poz, X, N, M, a, b, MaxInt;

int Max(int A, int B) {
    if(A > B)
        return A;
    return B;
}

void InsertArb(int left, int right, int k) {/// k = pozitia in vectorul arb
    int middle = (left + right) / 2;
    if(left == right) {
        arb[k] = X;
        return;
    }
    if(Poz <= middle)
        InsertArb(left, middle, 2 * k);
    else
        InsertArb(middle + 1, right, 2*k + 1);
    arb[k] = Max(arb[2*k], arb[2*k + 1]);
}

void ReadValues() {
    fscanf(f,"%d %d", &N, &M);
    for(int i = 1; i <= N; ++i) {
        fscanf(f, "%d", &X);
        Poz = i;
        InsertArb(1, N, 1);
    }
}

void DetMax(int left, int right, int k) {
    int middle = (left + right) / 2;
    if(a <= left && right <= b) {
        MaxInt = Max(arb[k], MaxInt);
        return;
    }
    if(a <= middle)
        DetMax(left, middle, 2 * k);
    if(middle < b)
        DetMax(middle + 1, right, 2 * k + 1);
}

void Do_Operation() {
    int op;
    while(M) {
        fscanf(f, "%d %d %d", &op, &a, &b);
        --M;
        if(op) {
            Poz = a, X = b;
            InsertArb(1, N, 1);
            continue;
        }
        MaxInt = 0;
        DetMax(1, N, 1);
        fprintf(g, "%d\n", MaxInt);
    }
}

int main() {
    f = fopen("arbint.in", "r");
    g = fopen("arbint.out", "w");
    ReadValues();
    Do_Operation();
    return 0;
}