Cod sursa(job #143988)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 27 februarie 2008 00:09:41
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#define MAX_N 100100
#define FIN "arbint.in"
#define FOUT "arbint.out"
using namespace std;
int arb[2*MAX_N+1];
int v[MAX_N+1],maxim,n,m;




void get_max(int a,int b,int p,int u,int nr){
        if (a<=p && u<=b){
                maxim=max(maxim,arb[nr]);
        } else {
                int m=(p+u)/2;
                if (a<=m){get_max(a,b,p,m,2*nr);}
                if (b>m){get_max(a,b,m+1,u,2*nr+1);}
        }
}


void modify(int a,int p,int u,int nr){
        if (p==u){
                arb[nr]=v[p];} else {
                int m=(p+u)/2;
                if (a<=m){modify(a,p,m,2*nr);} else{
                                modify(a,m+1,u,2*nr+1);}
                arb[nr]=max(arb[2*nr],arb[2*nr+1]);
                }

}



void iofile(void){
        freopen(FIN,"rt",stdin);
        freopen(FOUT,"wt",stdout);
        scanf("%d%d",&n,&m);
        int x;
        for (int i=1;i<=n;i++){
                scanf("%d",&v[i]);
                modify(i,1,n,1);
        }
        int a,b;
        for (int i=1;i<=n;i++){
                scanf("%d%d%d",&x,&a,&b);
                if (x){ v[a]=b;
                        modify(a,1,n,1);} else {
                        maxim=0;
                        get_max(a,b,1,n,1);
                        printf("%d\n",maxim);
                     }
        }
        fclose(stdin);
        fclose(stdout);
}

int main(void){
        iofile();
        return 0;
}