Cod sursa(job #1542278)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 5 decembrie 2015 11:18:30
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
# include <bits/stdc++.h>

using namespace std;

const int Nmax = 100000 + 5;

int N, M, x, op, a, b;
int arb[Nmax * 4], v[Nmax];

void update(int node, int left, int right, int poz, int val){

    if (left == right) {
        arb[node] = val;
        return ;
    }

    int mij = (right + left) / 2;

    if (poz <= mij) update (node * 2,  left, mij, poz, val);
        else update(node * 2 + 1, mij + 1, right, poz, val);

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

}

void build(int node, int left, int right) {
    if (left == right) {
        arb[node] = v[left];
        return ;
    }

    int mij = (left + right) / 2;

    build (node * 2, left, mij);
    build (node * 2 + 1, mij + 1, right);

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

int query(int node, int left, int right, int L, int R) {

    if (left >= L && right <= R) return arb[node];

    int  Max = 0;

    int mij = (right + left) / 2;

    if (L <= mij) Max = max(Max, query(node * 2, left, mij, L, R));

    if (R > mij) Max = max(Max, query(node * 2 + 1, mij + 1, right, L, R));

    return Max;
}

int main ()

{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d %d\n", &N, &M);

    for (int i = 1; i <= N; ++i)
    {
        scanf("%d ", &v[i]);
      //  update(1 , 1 , N, i, v[i]);
    }

    build (1, 1, N);

    for (int i = 1; i <= M; ++i)
    {
        scanf("%d %d %d\n", &op, &a, &b);

        if (!op) printf("%d\n", query(1, 1, N, a, b));
        else update(1, 1, N, a, b);

    }

    return 0;
}