Cod sursa(job #1760241)

Utilizator CatalinOlaruCatalin Olaru CatalinOlaru Data 20 septembrie 2016 16:18:20
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 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)
{

    if(low>=N)
        return;
    if(low==high) {
        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;
    int l=MININT,r=MININT;
    if(qlow<=mid)
        l=query(qlow,qhigh,low,mid,2*pos+1);
    if(qhigh>mid)
        r=query(qlow,qhigh,mid+1,high,2*pos+2);
    return max(l,r);
}

void update( int ind,int value,int x )
{
    int pos=x+ind;
    arb[pos]=value;
    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;
        if(A==0)
            g<<query(B-1,C-1,0,x,0)<<endl;
        if(A==1)
            update(B-1,C,x);
    }
}