Cod sursa(job #979851)

Utilizator harababurelPuscas Sergiu harababurel Data 2 august 2013 22:36:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;

int H[5*nmax], v[nmax], n, m, sol, type, a, b, val, pos;

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

    int mid = (left+right)>>1;
    if(pos <= mid) update(2*node, left, mid);
    else            update(2*node+1, mid+1, right);

    H[node] = max(H[2*node], H[2*node+1]);
}

void query(int node, int left, int right, int a, int b) {   //interoghez intervalul [a,b]
    if(a <= left && right <= b) {
        sol = max(sol, H[node]);
        return;
    }

    int mid = (left+right)>>1;
    if(a <= mid)   query(2*node, left, mid, a, b);
    if(mid < b)    query(2*node+1, mid+1, right, a, b);
}

int main() {
    ifstream f("arbint.in");
    ofstream g("arbint.out");

    f>>n>>m;
    for(int i=1; i<=n; i++) {
        f>>a;
        val = a;
        pos = i;
        update(1, 1, n);
    }

    for(int i=1; i<=m; i++) {
        f>>type>>a>>b;
        if(type==0) {
            sol = 0;
            query(1, 1, n, a, b);
            g<<sol<<"\n";
        }
        else {
            val = b;
            pos = a;
            update(1, 1, n);
        }
    }

    return 0;
}