Cod sursa(job #1324623)

Utilizator gabrielvGabriel Vanca gabrielv Data 22 ianuarie 2015 16:31:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <cstdio>
 
using namespace std;
 
#define maxim(a,b) ((a>b)?(a):(b))
 
#define NMAX 100015
 
int SegT[4*NMAX],V[NMAX];
int Sol;
int N,M;
 
inline int left_son(int nod)
{
    return nod<<1;
}
inline int right_son(int nod)
{
    return (nod<<1)+1;
}
 
void Build(int nod, int left, int right)
{
    if(left==right)
    {
        SegT[nod] = V[left];
        return;
    }
 
    int mid = (left+right)/2;
    Build(left_son(nod),left,mid);
    Build(right_son(nod),mid+1,right);
 
    SegT[nod] = maxim(SegT[left_son(nod)],SegT[right_son(nod)]);
}
 
void Update(int nod, int left, int right, int val, int pos)
{
    if(left==right)
    {
        SegT[nod] = val;
        return;
    }
 
    int mid = (left+right)/2;
    if(pos<=mid)
        Update(left_son(nod),left,mid,val,pos);
    else
        Update(right_son(nod),mid+1,right,val,pos);
 
    SegT[nod] = maxim(SegT[left_son(nod)],SegT[right_son(nod)]);
}
 
void Query(int nod, int left, int right, int beginI, int endI)
{
    if(beginI<= left && right<=endI)
    {
        Sol = maxim(Sol,SegT[nod]);
        return;
    }
 
    int mid = (left+right)/2;
 
    if(beginI<=mid)
        Query(left_son(nod),left,mid,beginI,endI);
    if(endI>mid)
        Query(right_son(nod),mid+1,right,beginI,endI);
}
 
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
 
    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;i++)
        scanf("%d",&V[i]);
 
    Build(1,1,N);
 
    for(int i=1,op,x,y;i<=M;i++)
    {
        scanf("%d%d%d",&op,&x,&y);
 
        if(op)
            Update(1,1,N,y,x);
        else
        {
            Sol=-1;
            Query(1,1,N,x,y);
            printf("%d\n",Sol);
        }
    }
 
    return 0;
}