Cod sursa(job #1278066)

Utilizator assa98Andrei Stanciu assa98 Data 28 noiembrie 2014 14:23:39
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

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

const int MAX_N = 100100;

int v[2 * MAX_N];

class TR {
public:
    int val;
    int f1, f2;
    TR(int _val = 0) {
        val = _val;
        f1 = f2 = 0;
    }
};

int TR[2000000];
int cat;

void build(int nod, int st, int dr) {
    if(st == dr) {
        e[nod].val = v[st];
        return;
    }
    
    int mij = (st + dr) / 2;
    e[nod].f1 = ++cat;
    e[nod].f2 = ++cat;
    build(e[nod].f1, st, mij);
    build(e[nod].f2, mij + 1, dr);

    val = max(e[f1].val, e[f2].val);
}

void update(int nod, int ant, int st, int dr, int v, int poz) {
    if(st == dr) {
        e[nod].val = v;
        return;
    }
    
    int mij = (st + dr) / 2;
    if(poz <= mij) {
        e[nod].f1 = ++cat;
        f2 = e[ant].f2;
        update(e[nod].f1, e[ant].f1, st, mij, v, poz);
    }
    else {
        e[nod].f2 = ++cat;
        e[nod].f1 = e[ant].f1;
        update(e[nod].f2, e[ant].f2, mij + 1, dr, v, poz);
    }

    val = max(e[e[nod].f1].val, e[e[nod].f2].val);
}

int query(int nodint st, int dr, int a, int b) {
    if(st >= a && dr <= b) {
        return e[nod].val;
    }

    int mij = (st + dr) / 2;
    int ans = 0;
    if(a <= mij) {
        ans = max(ans, query(e[nod].f1, st, mij, a, b));
    }
    if(b > mij) {
        ans = max(ans, query(e[nod].f2, mij + 1, dr, a, b));
    }
    return ans;
}

TR *R[MAX_N];

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

    int p;
    for(p = 1; p < n; p *= 2);

    ++cat;
    int act = cat;
    R[0]->build(1, p);
    for(int i = 1; i <= m; i++) {
        int t, a, b;
        fin >> t >> a >> b;
        if(t == 0) {
            fout << query(act, 1, p, a, b) << '\n';
        }
        else {
            ++cat;
            int ant = act;
            act = cat;
            update(act, ant, 1, p, b, a);
        }
    }
    return 0;
}