Cod sursa(job #1877908)

Utilizator zeboftwAlex Mocanu zeboftw Data 13 februarie 2017 19:37:02
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdlib.h>
#include <fstream>
#include <iostream>

using namespace std;

int maxarb[100000], a, b, maxim;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

void Update (int nod, int left, int right) {
    if (left == right) {
        maxarb[nod] = b;
        return;
    }

    int div = (left + right) / 2;

    if (a <= div) Update(nod * 2, left, div);
    else          Update(nod * 2 + 1, div + 1, right);

    maxarb[nod] = max(maxarb[nod * 2], maxarb[nod * 2 + 1]);
}

void Query (int nod, int left, int right) {
    if (left >= a && right <= b) {
        if (maxim < maxarb[nod]) maxim = maxarb[nod];
        return;
    }

    int div = (left + right) / 2;

    if (a <= div) Query(nod*2, left, div);
    if (div < b) Query(nod*2+1,div+1,right);
}

int main()
{
    int n, m;

    fin >> n >> m;

    for (int i=1; i <= n; i++) {
        fin >> b;
        a = i;
        Update(1,1,n);
    }

    for (int i=1; i <= m; i++) {
        int x;
        fin >> x >> a >> b;
        if (x) Update(1,1,n);
        else {
            maxim = -1;
            Query(1,1,n);
            fout << maxim << '\n';
        }
    }

    return 0;
}