Cod sursa(job #2001455)

Utilizator osiaccrCristian Osiac osiaccr Data 16 iulie 2017 18:18:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>

using namespace std;

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

int n, m, v[100001], A[1000001];

void build (int nod, int st, int dr) {
    int Max = 0;
    for (int i = st; i <= dr; i++)
        Max = max (Max, v[i]);
    A[nod] = Max;
    if (st < dr) {
        int mid = (st + dr) / 2;
        build (nod * 2, st, mid);
        build (nod * 2 + 1, mid + 1, dr);
    }
}

void querry (int nod, int st, int dr, const int a, const int b, int& sol) {
    if (a <= st && b >= dr) {
        sol = max (sol, A[nod]);
    }
    else {
        int mid = (st + dr) / 2;
        if (a <= mid) {
            querry (nod * 2, st, mid, a, b, sol);
        }
        if (b >= mid + 1) {
            querry (nod * 2 + 1, mid + 1, dr, a, b, sol);
        }
    }
}

void update (int nod, int st, int dr, const int p, const int x) {
    if (st == dr) {
        A[nod] = x;
    }
    else {
        int mid = (st + dr) / 2;
        if (p <= mid)
            update (nod * 2, st, mid, p ,x);
        else
            update (nod * 2+ 1, mid + 1, dr, p, x);
        A[nod] = max (A[2 * nod], A[2 * nod + 1]);
    }
}


int main () {
    fin >> n >> m;

    for (int i = 1; i <= n; i++) {
        fin >> v[i];
    }

    build (1, 1, n);

    for (int i = 1; i <= m; i++) {
        int c, a, b;
        fin >> c >> a >> b;
        if (c) {
            update (1, 1, n, a, b);
        }
        else {
            querry (1, 1, n, a, b, c);
            fout << c << "\n";
        }
    }



    return 0;
}