Cod sursa(job #1452787)

Utilizator Jercaianu_Alexandru_321CAJercaianu Alexandru Jercaianu_Alexandru_321CA Data 21 iunie 2015 20:08:47
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream>
#include<algorithm>
using namespace std;

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

const int MAX = (1 << 19) + 1;

int aint[MAX], A[MAX];
int M, N;
int val, pos;
int start, finish;
int ans;

void update(int left, int right, int idx) {
    if (left == right) {
        aint[idx] = val;
        return ;
    }

    int mid = (left + right) / 2;
    if (mid >= pos) {
        update(left, mid, 2 * idx);
    } else {
        update(mid + 1, right, 2 * idx + 1);
    }
    aint[idx] = max(aint[2 * idx], aint[2 * idx + 1]);
}

void query(int left, int right, int idx) {
    if (start <= left && right <= finish) {
        if (ans < aint[idx]) {
            ans = aint[idx];
        }
        return ;
    }

    int mid = (left + right) /2;
    if (start <= mid) {
        query (left, mid, 2 * idx);
    }
    if (mid < finish) {
        query(mid + 1, right, 2 * idx + 1);
    }
}

int main() {
    fin >> N >> M; 
    for (int i = 0; i < N; i++) {
        int el;
        pos = i;
        val = el;
        update(1, N, 1);
        fin >> el;
        A[i] = el;
    }

    for (int i = 0; i < M; i++) {
        int op, a, b; 
        fin >> op >> a >> b;
        if (op == 0) {
            ans = -1;
            start = a;
            finish = b;
            query(1, N, 1); 
            fout << ans << '\n';
        }
        else {
            pos = a;
            val = b;
            update(1, N, 1);
        }
    }
}