Cod sursa(job #1820987)

Utilizator savulescustefanSavulescu Stefan savulescustefan Data 2 decembrie 2016 13:51:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>

using namespace std;
int a,b,dr,st,x,i,nr,nr1,Max,c[600004],p,n,m;
void update (int nod, int st, int dr)
{
    if (st==dr)
    {
        c[nod]=x;
        return;
    }
    if ((st+dr)/2>=a)
        update(nod*2,st,(st+dr)/2);
    else
        update(nod*2+1,(st+dr)/2+1,dr);
    if (c[nod*2]>c[nod*2+1])
        c[nod]=c[nod*2];
    else
        c[nod]=c[nod*2+1];
}
void query (int nod, int st, int dr, int a, int b)
{
    if (st>=a && dr<=b)
    {
        if (Max<c[nod])
            Max=c[nod];
    }
    else
    {
        if (((st+dr)/2)>=a)
            query(nod*2,st,(st+dr)/2,a,b);
        if (((st+dr)/2+1)<=b)
            query(nod*2+1,(st+dr)/2+1,dr,a,b);
    }
}
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);
        a=i;
        update(1,1,n);
    }
    for (i=1;i<=m;i++)
    {
        scanf ("%d %d %d", &p, &a, &b);
        if (p==0)
        {
            Max=0;
            query(1,1,n,a,b);
            printf ("%d\n", Max);
        }
        else
        {
            x=b;
            update(1,1,n);
        }
    }
    return 0;
}