Cod sursa(job #988704)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 23 august 2013 17:25:49
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
#include <vector>
using std::vector;

unsigned put(unsigned pos, unsigned val, vector<unsigned> &tree, 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,tree,2*node,cleft,mid);
            if(left>tree[node]) tree[node]=left;
        }
        else{
            tree[node]=tree[2*node];
            unsigned right = put(pos,val,tree,2*node+1,mid+1,cright);
            if(right>tree[node]) tree[node]=right;
        }
        return tree[node];
    }
}
unsigned getmax(unsigned a,unsigned b, vector<unsigned> &tree, 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,tree,2*node,cleft,mid);
        else if(a<=mid&&b>mid){
            unsigned left=getmax(a,mid,tree,2*node,cleft,mid);
            unsigned right=getmax(mid+1,b,tree,2*node+1,mid+1,cright);
            if(left>right) return left;
            else return right;
        }
        else return getmax(a,b,tree,2*node+1,mid+1,cright);
    }
}

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

    unsigned N,M;
    fin>>N>>M;
    vector<unsigned> tree( ( (N&(N-1))==0 )?(2*N):(4*N) ,0);
    unsigned temp1,temp2;
    char c;

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

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