Cod sursa(job #1278065)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 28 noiembrie 2014 14:23:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include<fstream>
#include<algorithm>
using namespace std;

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

const int N = 101000;

struct no {
    int f1, f2, val;
};

int n, m, x[N], nodc, rad[N];
no a[N * 1000];

void update(int &nod, int pozx, int pozy, int poz, int val) {
    a[++nodc] = a[nod];
    nod = nodc;

    if(pozx == pozy) {
        a[nod].val = val;
        return;
    }

    int mid = (pozx + pozy) / 2;
    if(mid >= poz)
        update(a[nod].f1, pozx, mid, poz, val);
    else
        update(a[nod].f2, mid + 1, pozy, poz, val);

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

int query(int nod, int pozx, int pozy, int poz1, int poz2) {
    if(poz1 <= pozx && pozy <= poz2) {
        return a[nod].val;
    }
    int mid = (pozx + pozy) / 2, rez = 0;

    if(mid >= poz1)
        rez = query(a[nod].f1, pozx, mid, poz1, poz2);
    if(mid < poz2)
        rez = max(rez, query(a[nod].f2, mid + 1, pozy, poz1, poz2));

    return rez;
}

int main()
{
    int i, j;
    in >> n >> m;

    for(i = 1; i <= n; ++i) {
            in >> x[i];
        update(rad[1], 1, n, i, x[i]);
    }

    int last = 1;
    for(i = 2; i <= m + 1; ++i) {
        int op, aa, aaa;

        in >> op >> aa >> aaa;

        if(!op) {
            out << query(rad[1], 1, n, aa, aaa) << "\n";
        }
        else {
            rad[1] = rad[1];
            last = i;
            update(rad[1], 1, n, aa, aaa);
        }

    }
    return 0;
}