Cod sursa(job #1760225)

Utilizator CatalinOlaruCatalin Olaru CatalinOlaru Data 20 septembrie 2016 15:59:44
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<fstream>
#include<iostream>
#define MAX_LEN 100005
#define MININT -1000000000
#define max(a,b) ((a<b)?b:a)
using namespace std;
int vec[MAX_LEN];
int arb[262145];
void buildTree(int low, int high, int pos,int N)
{
//    cout<<"pos "<<pos<<"low "<<low<<"high "<<high<<endl;
    if(low==high) {
        if(low>=N)
            return;
        arb[pos] = vec[low];
        return;
    }
    int mid=(high+low)/2;
    buildTree(low,mid,2*pos+1,N);
    buildTree(mid+1,high,2*pos+2,N);
    arb[pos]=max(arb[2*pos+1],arb[2*pos+2]);
}

int query(int qlow,int qhigh,int low, int high, int pos)
{
    if(qlow<=low && qhigh >= high)
        return arb[pos];
    if(qlow>high || qhigh<low)
        return MININT;
    int mid=(low+high)/2;
    return max(query(qlow,qhigh,low,mid,2*pos+1),query(qlow,qhigh,mid+1,high,2*pos+2));
}

int update( int ind,int value,int x )
{
    int pos=x+ind;
    arb[pos]=value;
    int parent=(pos-1)/2;
    while(pos!=0)
    {
        pos=(pos-1)/2;
        arb[pos]=max(arb[2*pos+1],arb[2*pos+2]);
    }

}
int main()
{
    int N,M;
    fstream f,g;
    f.open("arbint.in",ios::in);
    g.open("arbint.out",ios::out);
    f>>N>>M;
    int i=0;
    for(i=0;i<N;i++)
        f>>vec[i];
    int x=1;
    while(x<N)
        x*=2;
    x--;

    for(i=0;i<2*x+1;i++)
        arb[i]=MININT;
    buildTree(0,x,0,N);

    int A,B,C;
    for(i=0;i<M;i++)
    {
        f>>A>>B>>C;
//        g<<A<<" "<<B<<" "<<C<<endl;
        if(A==0)
            g<<query(B-1,C-1,0,x,0)<<endl;
        else if(A==1)
            update(B-1,C,x);
    }


}