Cod sursa(job #1127968)

Utilizator UngureanuRobertUngureanu Robert Mihail UngureanuRobert Data 27 februarie 2014 14:32:50
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>

using namespace std;

    FILE *f = fopen("arbint.in","r");
    FILE *g = fopen("arbint.out","w");

    long long arb[1<<19],n,m,i,x,y,z,maxim;

    void query(long nod,long st,long dr,long long a,long long b){
        if(a<=st && dr<=b){
            if(maxim<=arb[nod])
                maxim=arb[nod];
                return ;
            }

            long long mij=(st+dr)/2;
            if(a<=mij) query(2*nod,st,mij,a,b);
            if(b>=mij+1) query(2*nod+1,mij+1,dr,a,b);

    }

    void update(long long nod,long long st,long long dr,long long poz,long long val){
        if(st==dr){
            arb[nod]=val;
            return ;
            }

                long long mij=(st+dr)/2;
                if(poz<=mij) update(2*nod,st,mij,poz,val);
                else update(2*nod+1,mij+1,dr,poz,val);

        arb[nod]=max(arb[2*nod],arb[2*nod+1]);
    }



int main()
{
    fscanf(f,"%d %d", &n,&m);
    for(i=1;i<=n;i++){
        fscanf(f,"%d", &x);
        update(1,1,n,i,x);
    }
    for(i=1;i<=m;i++){
        fscanf(f,"%d %d %d", &x,&y,&z);
        maxim=0;
        if(x==0){
                query(1,1,n,y,z);
                fprintf(g,"%d\n",maxim);
        }

        else
            update(1,1,n,y,z);
    }

    return 0;
}