Cod sursa(job #900012)

Utilizator SerbanAlexandru9Serban Alexandru SerbanAlexandru9 Data 28 februarie 2013 17:19:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include<stdio.h>
#define nmax 100005
int x[3*nmax],v[nmax],n,m;
FILE *f;
void cit(){
    fscanf(f,"%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        fscanf(f,"%d",&v[i]);
}
void init(int k,int st,int dr){
    int m;
    if(st==dr)
        x[k]=v[st];
    else{
        m=(st+dr)/2;
        init(2*k,st,m);
        init(2*k+1,m+1,dr);
        if(x[2*k]>x[2*k+1])
            x[k]=x[2*k];
        else
            x[k]=x[2*k+1];
    }
}
int query(int k,int st,int dr,int a,int b){
    if(a<=st&&dr<=b)
        return x[k];
    else{
        int m,val,max=0;
        m=(st+dr)/2;
        if(a<=m){
            val=query(2*k,st,m,a,b);
            if(val>max)
                max=val;
        }
        if(b>=m+1){
            val=query(2*k+1,m+1,dr,a,b);
            if(val>max)
                max=val;
        }
        return max;
    }
}
void update(int k,int st,int dr,int a,int b){
    if(st==dr)
        x[k]=b;
    else{
        int m;
        m=(st+dr)/2;
        if(a<=m){
            update(2*k,st,m,a,b);
            if(x[2*k]<x[2*k+1])
                x[k]=x[2*k+1];
            else
                x[k]=x[2*k];
        }else{
            update(2*k+1,m+1,dr,a,b);
            if(x[2*k]<x[2*k+1])
                x[k]=x[2*k+1];
            else
                x[k]=x[2*k];
        }
    }
}
int main(){
    FILE *g;
    int a,b,c;
    f=fopen("arbint.in","r");
    g=fopen("arbint.out","w");
    cit();
    init(1,1,n);
    for(int i=1;i<=m;i++){
        fscanf(f,"%d%d%d",&c,&a,&b);
        if(c==0)
            fprintf(g,"%d\n",query(1,1,n,a,b));
        else
            update(1,1,n,a,b);
    }
    fclose(f);
    fclose(g);
    return 0;
}