Cod sursa(job #1605126)

Utilizator popescu.octavianPopescu Octavian popescu.octavian Data 18 februarie 2016 19:41:01
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define NMax 100100
#define Max(a,b) (a<b) ? b : a
using namespace std;
int N, M, ARB[4*NMax], i, Maxim, poz, val, start, sfarsit, tip, a, b, x;
void Update (int nod, int st, int dr)
{
    if(st==dr)
    {
        ARB[nod]=val;
        return;
    }
    int m=(st+dr)/2;
    if(poz<=m) Update(2*nod,st,m);
        else Update(2*nod+1,m+1,dr);
    ARB[nod]=Max(ARB[2*nod],ARB[2*nod+1]);
}
void Interog (int nod, int st, int dr)
{
    if(start<=st && dr<=sfarsit)
    {
        if(Maxim<ARB[nod]) Maxim=ARB[nod];
        return;
    }
    int m=(st+dr)/2;
    if(start<=m) Interog(2*nod,st,m);
    if(m<sfarsit) Interog(2*nod+1,m+1,dr);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d %d",&N,&M);
    for(i=1;i<=N;i++)
    {
        scanf("%d",&x);
        poz=i; val=x;
        Update(1,1,N);
    }
    for(i=1;i<=M;i++)
    {
        scanf("%d %d %d",&tip,&a,&b);
        if(tip==0)
        {
            Maxim=0; start=a; sfarsit=b;
            Interog(1,1,N);
            printf("%d\n",Maxim);
        }
        else
        {
            poz=a; val=b;
            Update(1,1,N);
        }
    }
    return 0;
}