Cod sursa(job #749552)

Utilizator gabrielvGabriel Vanca gabrielv Data 17 mai 2012 17:57:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<cstdio>
#define NMAX 400500
#define maxim(a,b) ((a>b)?(a):(b))

using namespace std;

int SegT[NMAX];
int Sol,A,B,N,k,M;

int left_son(int nod)
{
    return nod<<1;
}
int right_son(int nod)
{
    return (nod<<1)+1;
}
bool verif(int left)
{
    if(left<=k)
        return true;
    return false;
}
void update(int nod, int left, int right)
{
     if(left==right)
     {
            SegT[nod]=B;
            return;
     }
     int mid;
     mid=left+(right-left)/2;
     if(A<=mid)
        update(left_son(nod),left,mid);
    else
        update(right_son(nod),mid+1,right);
    if(verif(mid+1))
        SegT[nod]=maxim(SegT[left_son(nod)],SegT[right_son(nod)]);
    else
        SegT[nod]=SegT[left_son(nod)];
}
void query(int nod, int left, int right)
{
    if(A<=left && right<=B)
     {
            Sol=maxim(Sol,SegT[nod]);
            return;
     }
     int mid;
     mid=left+(right-left)/2;
     if(A<=mid)
        query(left_son(nod),left,mid);
    if(B>mid)
        query(right_son(nod),mid+1,right);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d",&N,&M);
    for(k=1;k<=N;k++)
    {
        scanf("%d",&B);
        A=k;
        update(1,1,N);
    }
    int op;
    while(M--)
    {
        scanf("%d %d %d",&op,&A,&B);
        if(op==0)
        {
            Sol=-1;
            query(1,1,N);
            printf("%d\n",Sol);
        }
        else
            update(1,1,N);
    }
    return 0;
}