Cod sursa(job #1528430)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 19 noiembrie 2015 18:14:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
using namespace std;

const int NMAX = 400010;
int v[NMAX], numere[100001];
int n, m, i, j, k, l, q;
int a, b, val, poz;
//a, b pt query si val / poz pt update
int maxim(int x, int y){
    if (x > y)
        return x;
    return y;
}

void tamise(int p, int st, int dr);
void update(int p, int st, int dr);
int query (int p, int st, int dr);

int main(){
    ifstream in("arbint.in");
    ofstream out("arbint.out");
    in >> n >> m;
    for (i = 1; i <= n; i++)
        in >> numere[i];
    tamise(1, 1, n);
    while (m--){
        in >> k;
        if (k == 0){
            in >> a >> b;
            out << query(1, 1, n) << '\n';
        }
        else{
            in >> poz >> val;
            update(1, 1, n);
        }
    }
    return 0;
}

int query (int p, int st, int dr){
    if (a <= st && b >= dr)
        return v[p];
    int r = -2000000000;
    if (a <= (st + dr) / 2)
        r = query(2 * p, st, (st + dr) / 2);
    if (b > (st + dr) / 2)
        r = maxim(r, query(2 * p + 1, (st + dr) / 2 + 1, dr));
    return r;
}

void update(int p, int st, int dr){
    if (st == dr){
        v[p] = val;
        return;
    }
    if (poz <= (st + dr) / 2)
        update(2 * p, st, (st + dr) / 2);
    else
        update(2 * p + 1, (st + dr) / 2 + 1, dr);
    v[p] = maxim(v[2 * p], v[2 * p + 1]);
    return;
}

void tamise(int p, int st, int dr){
    if (st == dr){
        v[p] = numere[st];
        return;
    }
    tamise(2 * p, st, (st + dr) / 2);
    tamise(2 * p + 1, (st + dr) / 2 + 1, dr);
    v[p] = maxim(v[2 * p], v[2 * p + 1]);
    return;
}