Cod sursa(job #1975899)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 2 mai 2017 13:31:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <cstdio>
#include <cmath>
#define Nmax 100001
using namespace std;

ofstream g("arbint.out");

int V[Nmax*3],N,n,m,x,y,t;

void up(int x,int val)
{
    x+=N;

    V[x] = val;
    while (x>1)
    {
        x/=2;
        V[x] = max(V[x*2],V[x*2+1]);
    }
}

int query(int a,int b)
{
    int rez = 0;
    a+=N;
    b+=N;

    while (a<b)
    {
        rez = max(rez,max(V[a],V[b]));

        a=(a+1)/2;
        b=(b-1)/2;
    }
    if (a==b)
        rez = max(rez,V[a]);
    return rez;
}

int main()
{
    freopen("arbint.in","r",stdin);

    scanf("%d%d",&n,&m);

    N = 1<<(int)log2(n);
    if (N<n)
        N *= 2;
    N--;

    n += N;
    for (int i=N+1;i<=n;i++)
        scanf("%d",&V[i]);

    for (int i=N;i>=1;i--)
        V[i] = max(V[i*2+1],V[i*2]);

    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&t,&x,&y);
        if (t==0)
            g<<query(x,y)<<'\n';
        else
            up(x,y);
    }

    return 0;
}