Cod sursa(job #1820852)

Utilizator savulescustefanSavulescu Stefan savulescustefan Data 2 decembrie 2016 12:20:58
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>

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