Cod sursa(job #1147748)

Utilizator Claudiu95Vartolomei Alexandru Claudiu Claudiu95 Data 20 martie 2014 09:06:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#define maxx 100004
#define valm 1000000005
#include<algorithm>
#include<math.h>
using namespace std;

long long int A[300001],maxim,valoare;
int m,n,op,a,b,poz;
void update(int i,int left,int right){
    if(left==right){
        A[i]=valoare;
    }
    else{
        int mij=(left+right)/2;
        if(poz<=mij){
            update(2*i,left,mij);
        }
        else{
            update(2*i+1,mij+1,right);
        }
        A[i]=max(A[2*i],A[2*i+1]);
    }
}
void maxi(int i,int left,int right,long long int &maxim){
    if(a<= left && b>=right){
        maxim=max(maxim,A[i]);
        return;
    }
    int mij=(left+right)/2;
    if(b<=mij){
        maxi(2*i,left,mij,maxim);
    }
    else{
        if(a>mij){
            maxi(2*i+1,mij+1,right,maxim);
        }
        else{
            maxi(2*i,left,mij,maxim);
            maxi(2*i+1,mij+1,right,maxim);
        }
    }
}
int main(){
        freopen("arbint.in","r",stdin);
        freopen("arbint.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i){
            scanf("%d",&a);
            valoare=a;
            poz=i;
            update(1,1,n);
        }

        for(int i=1;i<=m;++i){
           scanf("%d%d%d",&op,&a,&b);
            if(op==0){
                maxim=0;
                maxi(1,1,n,maxim);
                printf("%d\n",maxim);
            }
            else{
                poz=a;
                valoare=b;
                update(1,1,n);

            }
        }

    return 0;
}