Cod sursa(job #1167196)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 4 aprilie 2014 16:31:18
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<cstdio>
#include<algorithm>

using namespace std;

const int NMAX = 100000+5;

void Read(),Solve();

int N,M,Lim;
int AI[2*NMAX];
int V[NMAX];

void Build(int nod,int left,int right)
{
    if(left == right)
    {
        AI[nod] = V[left];
        return;
    }

    int middle = (left + right)/2;

    Build(2*nod,left,middle);
    Build(2*nod+1,middle+1,right);

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

int Query(int nod,int left,int right,int low,int high)
{
    if(right < low || left > high) return 0;

    if(left == right) return AI[nod];

    int middle = (left + right)/2;
    int qleft = Query(2*nod,left,middle,low,high);
    int qright = Query(2*nod+1,middle+1,right,low,high);

    return max(qleft,qright);
}

void Update(int nod,int left,int right,int position,int value)
{
    if(left == right)
    {
        AI[nod] = value;
        return;
    }

    int middle = (left + right)/2;

    if(position <= middle) Update(2*nod,left,middle,position,value);
    else Update(2*nod+1,middle+1,right,position,value);
}

int main()
{
    Read();
    Solve();

    return 0;
}

void Read()
{
    int i;

    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d%d",&N,&M);

    for(i = 1; i <= N; i++)
        scanf("%d",&V[i]);
}

void Solve()
{
    int t,a,b;

    for(Lim = 1; Lim < N; Lim <<= 1);

    Build(1,1,Lim);

    for(; M; --M)
    {
        scanf("%d%d%d",&t,&a,&b);
        if(t==0) printf("%d\n",Query(1,1,Lim,a,b));
        else Update(1,1,Lim,a,b);
    }
}