Cod sursa(job #1373283)

Utilizator avaspAva Spataru avasp Data 4 martie 2015 17:49:46
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include<cstdio>
using namespace std;
int v[200001],rez,n,m,c,ordmax;
int a[200001];
int maxim(int nr1,int nr2){
    if(nr1>nr2)
        return nr1;
    return nr2;
}

int construiesc(int l1,int l2,int ord){
    if(l1==l2){
        a[ord]=v[l1];
        return a[ord];
    }
    else{
        if(a[ord*2]==-1)
            a[ord*2]=construiesc(l1,(l1+l2)/2,ord*2);
        if(a[ord*2+1]==-1)
            a[ord*2+1]=construiesc(((l1+l2)/2)+1,l2,ord*2+1);
        a[ord]=maxim(a[ord*2],a[ord*2+1]);
        return a[ord];
    }
}
void modif(int poz,int val){
    int ord=ordmax-(rez-n)-(n-poz);
    a[ord]=val;
    bool pp=true;
    int maxx;
    while(ord>=1&&pp==true){
        maxx=maxim(a[(ord/2) *2],a[(ord/2) *2 +1]);
        if(a[ord/2]==maxx)
            pp=false;
        else{
            a[ord/2]=maxx;
            ord/=2;
        }
    }
}

int rezult(int l1,int l2,int ord,int st,int dr){
    if(l1==st&&l2==dr)
        return a[ord];
    else{
        // l1 (l1+l2)/2  + (l1+l2)/2+1 l2
        if(dr<=(l1+l2)/2)
            return rezult(l1, (l1+l2)/2 , ord*2, st, dr);
        else
        if(st>=((l1+l2)/2)+1)
            return rezult(((l1+l2)/2)+1, l2, ord*2+1, st,dr);
        else
        if(st<=(l1+l2)/2 && dr>=((l1+l2)/2)+1)
            return maxim( rezult(l1,(l1+l2)/2,ord*2,st,(l1+l2)/2), rezult(((l1+l2)/2)+1,l2,ord*2+1,((l1+l2)/2)+1,dr));
    }
}



int main(){
    int st,dr;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&v[i]);
    rez=1;
    while(rez<n){
        rez*=2;
    }
    for(int i=1;i<=rez*2;i++)
        a[i]=-1;
    ordmax=0;
    int i=rez;
    while(i>=1){
        ordmax+=i;
        i/=2;
    }
    construiesc(1,rez,1);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&c,&st,&dr);
        if(c==0)
           printf("%d\n",rezult(1,rez,1,st,dr));
        if(c==1)
            modif(st,dr);
    }
    return 0;
}