Cod sursa(job #1281766)

Utilizator mariusn01Marius Nicoli mariusn01 Data 3 decembrie 2014 18:27:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#define DN (1<<nod)

using namespace std;

int A[400010];
int V[100010];
int n, m, i, a, b, p, x, t, sol;

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

void build(int st, int dr, int nod) {
    if (st == dr)
        A[nod] = V[st];
    else {
        int mid = (st + dr)/2;
        build(st, mid, 2*nod);
        build(mid+1, dr, 2*nod+1);
        A[nod] = max(A[2*nod], A[2*nod+1]);
    }
}

void update(int st, int dr, int nod, int poz, int val) {
    if (st == dr)
        A[nod] = val;
    else {
        int mid = (st + dr)/2;
        if (poz <= mid)
            update(st, mid, 2*nod, poz, val);
        if (poz >= mid+1)
            update(mid+1, dr, 2*nod+1, poz, val);
        A[nod] = max(A[2*nod], A[2*nod+1]);
    }
}

void query(int st, int dr, int nod, int a, int b) {
    if (a<=st && dr <= b)
        sol = max(sol, A[nod]);
    else {
        int mid = (st + dr)/2;
        if (a <= mid)
            query(st, mid, 2*nod, a, b);
        if (b >= mid+1)
            query(mid+1, dr, 2*nod+1, a, b);
    }
}



int main() {
    fin>>n>>m;

    for (i=1;i<=n;i++)
        fin>>V[i];

    build(1, n, 1);

    for (i=1;i<=m;i++) {
        fin>>t>>a>>b;
        if (t == 1)
            update(1, n, 1, a, b);
        else {
            sol = -1;
            query(1, n, 1, a, b);
            fout<<sol<<"\n";
        }
    }
    return 0;
}