Cod sursa(job #1278068)

Utilizator assa98Andrei Stanciu assa98 Data 28 noiembrie 2014 14:24:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 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 {
private: 
    int val;
    TR *f1, *f2;
public:
    TR(int _val = 0) {
        val = _val;
        f1 = f2 = NULL;
    }
 
    void build(int st, int dr) {
        if(st == dr) {
            val = v[st];
            return;
        }
         
        int mij = (st + dr) / 2;
        f1 = new TR();
        f2 = new TR();
        f1->build(st, mij);
        f2->build(mij + 1, dr);
 
        val = max(f1->val, f2->val);
    }
 
    void update(TR *ant, int st, int dr, int v, int poz) {
        if(st == dr) {
            val = v;
            return;
        }
         
        int mij = (st + dr) / 2;
        if(poz <= mij) {
            f1 = new TR();
            f2 = ant->f2;
            f1->update(ant->f1, st, mij, v, poz);
        }
        else {
            f2 = new TR();
            f1 = ant->f1;
            f2->update(ant->f2, mij + 1, dr, v, poz);
        }
 
        val = max(f1->val, f2->val);
    }
 
    int query(int st, int dr, int a, int b) {
        if(st >= a && dr <= b) {
            return val;
        }
 
        int mij = (st + dr) / 2;
        int ans = 0;
        if(a <= mij) {
            ans = max(ans, f1->query(st, mij, a, b));
        }
        if(b > mij) {
            ans = max(ans, f2->query(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);
 
    R[0] = new TR();
    R[0]->build(1, p);
    int act = 0;
    for(int i = 1; i <= m; i++) {
        int t, a, b;
        fin >> t >> a >> b;
        if(t == 0) {
            fout << R[act]->query(1, p, a, b) << '\n';
        }
        else {
            R[++act] = new TR();
            R[act]->update(R[act - 1], 1, p, b, a);
        }
    }
    return 0;
}