Cod sursa(job #922303)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 22 martie 2013 03:42:59
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#define maxim(a,b) (a>b)?a:b
using namespace std;

int arb[500005];
int n,m,a,b, mare;

void introduce(int val,int ord,int i,int j,long long nod) {
    if (i==j) {
        arb[nod] = val;
        return;
    }
    int mij = i + (j-i)/2;
    if (ord <= mij) introduce(val,ord,i,mij,2*nod);
    else introduce(val,ord,mij+1,j,2*nod+1);
    arb[nod] = maxim(arb[2*nod],arb[2*nod+1]);
}

void maxinterval(int a,int b,int i,int j,int nod) {
    if (a<=i && j<=b){
        mare=maxim(mare,arb[nod]);
        return;
        }

        int mij = i + (j-i)/2;
        if(a<=mij)maxinterval(a,b,i,mij,nod*2);
        if(b>=mij+1)maxinterval(a,b,mij+1,j,nod*2+1);

}


int main() {
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for (int i=1;i<=n;i++) {
        int crt;
        scanf("%d",&crt);
        introduce(crt,i,1,n,1);
    }
    for (int i=1;i<=m;i++) {
        int tip,a,b;
        scanf("%d %d %d",&tip,&a,&b);
        if (tip == 0) {
            mare=0;
            maxinterval(a,b,1,n,1);
            printf("%d\n",mare);
        }
        else introduce(b,a,1,n,1);
    }
}