Cod sursa(job #1387254)

Utilizator razboi4Manole Iulian razboi4 Data 13 martie 2015 21:31:02
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<bits/stdc++.h>
using namespace std;
int N, M, poz, start, finish, Arb[400005], val, maxim, X, tip, a, b;

void Uptade(int nod, int st, int dr)
{
    if(st == dr) {
        Arb[nod] = b;
        return ;
    }
    int mid = (st + dr) / 2;
    if(a <= mid)
        Uptade(2 * nod, st, mid);
    else
        Uptade(2 * nod + 1, mid + 1, dr);
    Arb[nod] = max(Arb[2 * nod], Arb[2 * nod + 1]);
}

void Query(int nod, int st, int dr)
{
    if(a <= st && dr <= b) {
        if(maxim < Arb[nod])
            maxim = Arb[nod];
        return ;
    }
    int mid = (st + dr) / 2;
    if(a <= mid)
        Query(2 * nod, st, mid);
    if(b > mid)
        Query(2 * nod + 1, mid + 1, dr);
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d%d", &N, &M);
    for(int i = 1; i <= N; ++ i) {
        scanf("%d", &X);
        a = i; b = X;
        Uptade(1, 1, N);
    }
    for( ; M; -- M) {
        scanf("%d%d%d", &tip, &a, &b);
        if(tip == 1)
            Uptade(1, 1, N);
        else {
            maxim = -1;
            Query(1, 1, N);
            printf("%d\n", maxim);
        }
    }
    return 0;
}