Cod sursa(job #1469764)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 9 august 2015 15:07:56
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
/**
  *  Worg
  */
#include <cstdio>
#include <algorithm>

#define Dim 4 * 100100
#define buffDim 50500

using namespace std;
FILE *fin=freopen("arbint.in","r",stdin);
FILE *fout=freopen("arbint.out","w",stdout);

int arb[Dim];
int pos, n, m, ans;
char buff[buffDim];

void read(int &nr) {

    while( buff[pos] < '0' || buff[pos] > '9' )
        if( ++pos == buffDim ) {

            fread(buff, 1, buffDim, stdin);
            pos = 0;
        }

    nr = 0;
    while( buff[pos] >= '0' && buff[pos] <= '9' ) {

        nr = nr * 10 + buff[pos] - '0';
        if( ++pos == buffDim ) {

            fread(buff, 1, buffDim, stdin);
            pos = 0;
        }
    }
}

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

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

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

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

void query(int node, int left, int right, int first, int last) {

    if(first <= left && right <= last) {
        ans = max(ans, arb[node]);
        return;
    }

    int mid = (left + right) >> 1;
    if(first <= mid)
        query(node * 2, left, mid, first, last);
    else
        query(node * 2 + 1, mid + 1, right, first, last);
}

int main() {

    fread(buff, 1, buffDim, stdin);
    read(n); read(m);

    int x, op, a, b;
    for(int i = 1; i <= n; ++i) {

        read(x);
        update(1, 1, n, i, x);
    }

    for(int i = 1; i <= m; ++i) {

        read(op); read(a); read(b);
        if( !op ) {
            ans = 0;
            query(1, 1, n, a, b);
            printf("%d\n", ans);
        }
        else {
            update(1, 1, n, a, b);
        }
    }

    return 0;
}