Cod sursa(job #2397515)

Utilizator CojocariuAlexandruCojocariu Alexandru CojocariuAlexandru Data 4 aprilie 2019 15:13:40
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#define NMAX 100005
#define INF 999999999

using namespace std;

FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");

int max2(int a, int b){
    if(a >= b)
        return a;
    return b;
}

void U(int, int, int);
void Q(int, int, int);

int arbint[5*NMAX];
int n, m, i, pozitie, valoare, maxim, a, b, x, op;

int main(){
    fscanf(fin, "%d%d", &n, &m);
    for(i=1; i<=n; ++i){
        pozitie = i;
        fscanf(fin, "%d", &x);
        valoare = x;
        U(1, 1, n);
        }
    for(i=1; i<=n; ++i){
        fscanf(fin, "%d%d%d", &op, &a, &b);
        if(op == 1){
            x=b;
            pozitie = a;
            U(1, 1, n);
            }
            else{
                maxim = -1;
                Q(1, 1, n);
                fprintf(fout, "%d\n", maxim);
                }
        }
    return 0;
}

void U(int nod, int left, int right){
    int mid=(left+right)/2;
    if(left == right){
        arbint[nod] = x;
        }
        else{
            if(pozitie <= mid)
                U(nod*2, left, mid);
                else
                U(nod*2+1, mid+1, right);
            arbint[nod] = max2(arbint[2*nod], arbint[2*nod+1]);
            }
}

void Q(int nod, int left, int right){
    int mid = (left+right)/2;
    if(left >= a && right <= b){
        if(arbint[nod] > maxim)
            maxim = arbint[nod];
        }
        else{
            if(a <= mid)
                Q(nod*2, left, mid);
            if(mid < b)
                Q(nod*2+1, mid+1, right);
            }
}