Cod sursa(job #2038387)

Utilizator Master011Dragos Martac Master011 Data 13 octombrie 2017 17:28:54
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<cstdio>
#include<algorithm>
using namespace std;

const int nMax = 100000 + 5;
int n, q, arb[2 * nMax];

void update (int pos, int val, int l, int r, int nod){
    if (r == l){
        arb[nod] = val;
        return;
    }

    int m = (r + l) / 2;
    if(pos <= m) update(pos, val, l, m, 2 * nod);
    else         update(pos, val, m + 1, r, 2 * nod + 1);

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

int query (int a, int b, int l, int r, int nod){
    if(a <= l && b >= r)
        return arb[nod];
    int m = (l + r) / 2;

    int m1 = -1, m2 = -1;

    if(a <= m) m1 = query(a, b, l, m, nod * 2);
    if (b > m) m2 = query(a, b, m + 1, r, nod * 2 + 1);

    return max(m1, m2);
}

int main (){
    FILE *in = fopen("arbint.in","r");
    FILE *out = fopen("arbint.out","w");


    int x;
    fscanf(in,"%d%d",&n,&q);
    for (int i = 1 ; i <= n ; ++i){
        fscanf(in,"%d",&x);
        update(i, x, 1, n, 1);
    }

    int a, b, c;
    while(q--){
        fscanf(in,"%d%d%d",&a,&b,&c);
        if(a == 0){
            fprintf(out, "%d\n", query(b, c, 1, n, 1));
        }else{
            update(b, c, 1, n, 1);
        }
    }


    return 0;
}