Cod sursa(job #1172233)

Utilizator bogdanmarin69Bogdan Marin bogdanmarin69 Data 17 aprilie 2014 00:53:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
using namespace std;
#define MAX 100001
int v[MAX], n, m, arb[3*MAX], a, b, cod;
void update(int nod, int left, int right, int pos); //poz=0 pt bulid
int query(int nod, int left, int right); //a si b setate inainte de apel
int main()
{
    int i;
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i=1; i<=n; i++)
        scanf("%d", v+i);
    update(1, 1, n, 0);
    for(i=1; i<=m; i++){
        scanf("%d%d%d", &cod, &a, &b);
        if(cod==1){
            v[a] = b;
            update(1, 1, n, a);
        }
        else
            printf("%d\n", query(1, 1, n));
    }
    return 0;
}
int query(int nod, int left, int right)
{
    if(a<=left and right<=b)
        return arb[nod];
    int mj = (left+right)/2, maxleft=0, maxright=0;
    if(a<=mj)
        maxleft = query(nod*2, left, mj);
    if(mj<b)
        maxright = query(nod*2+1, mj+1, right);
    return maxleft>maxright?maxleft:maxright;
}
void update(int nod, int left, int right, int poz)
{
    if(left==right)
        arb[nod] = v[left];
    else{
        int mj = (left+right)/2;
        if(poz==0 or poz<=mj)
            update(nod*2, left, mj, poz);
        if(poz==0 or poz>mj)
            update(nod*2+1, mj+1, right, poz);
        arb[nod] = arb[nod*2]>arb[nod*2+1]?arb[nod*2]:arb[nod*2+1];
    }
}