Cod sursa(job #1523707)

Utilizator xnonGafita Andrei xnon Data 13 noiembrie 2015 01:40:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#define maxim(a,b) ( (a > b) ? a : b )
int v[100001], arb[1000001],n,m,nrmax;

void update(int s,int d,int val,int nod,int poz){
    if(s == d){arb[nod] = val;return;}
    int mij = ((s+d) >> 1);

    if(poz <= mij)update(s,mij,val,nod<<1,poz);
        else update(mij+1,d,val,(nod<<1)+1,poz);
        arb[nod] = maxim(arb[nod<<1],arb[(nod<<1)+1]);
}

void cautare(int s,int d, int a,int b,int nod){
    int mij = ((s+d) >> 1);
        if(a<=s && d<=b){nrmax = ((arb[nod] > nrmax) ? arb[nod] : nrmax);return;}
    else {
        if(a <= mij)cautare(s,mij,a,b,(nod << 1));
        if(mij < b)cautare(mij+1,d,a,b,((nod << 1)+1));
    }
}

int main()
{freopen("arbint.in","r",stdin);
 freopen("arbint.out","w",stdout);
 scanf("%i %i",&n,&m);
    for(int i = 1;i<=n;i++){
        scanf("%i",&v[i]);
        update(1,n,v[i],1,i);
    }

    int a,b,c;
    while(m--){
        scanf("%i %i %i",&a,&b,&c);
        if(a == 1)update(1,n,c,1,b);
        else {nrmax = -1;
            cautare(1,n,b,c,1);
            printf("%i \n",nrmax);
        }
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}