Cod sursa(job #988710)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 23 august 2013 17:40:19
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>

const unsigned NMAX=100000;
unsigned tree[4*NMAX];

unsigned put(unsigned pos, unsigned val, unsigned node, unsigned cleft, unsigned cright){
    // !!! cleft<=pos and pos<=cright
    if(cleft==cright) return tree[node]=val;
    else{
        unsigned mid = (cleft+cright)/2;
        if(pos<=mid){
            tree[node]=tree[2*node+1];
            unsigned left = put(pos,val,2*node,cleft,mid);
            if(left>tree[node]) tree[node]=left;
        }
        else{
            tree[node]=tree[2*node];
            unsigned right = put(pos,val,2*node+1,mid+1,cright);
            if(right>tree[node]) tree[node]=right;
        }
        return tree[node];
    }
}
unsigned getmax(unsigned a,unsigned b, unsigned node, unsigned cleft, unsigned cright){
    // !!! cleft <= a <= b <= cright
    if(cleft==cright) return tree[node];
    else{
        unsigned mid = (cleft+cright)/2;
        if(b<=mid) return getmax(a,b,2*node,cleft,mid);
        else if(a<=mid&&b>mid){
            unsigned left=getmax(a,mid,2*node,cleft,mid);
            unsigned right=getmax(mid+1,b,2*node+1,mid+1,cright);
            if(left>right) return left;
            else return right;
        }
        else return getmax(a,b,2*node+1,mid+1,cright);
    }
}

int main(){
    std::ifstream fin("arbint.in");
    std::ofstream fout("arbint.out");

    unsigned N,M;
    fin>>N>>M;
    unsigned temp1,temp2;
    char c;

    for(temp1=1;temp1<=N;++temp1){
        fin>>temp2;
        put(temp1,temp2,1,1,N);
    }

    while(M--){
        fin>>c>>temp1>>temp2;
        if(c=='0') fout<<getmax(temp1,temp2,1,1,N)<<'\n';
        else put(temp1,temp2,1,1,N);
    }
}