Cod sursa(job #1323775)

Utilizator serban_ioan97Ciofu Serban serban_ioan97 Data 21 ianuarie 2015 15:46:01
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <algorithm>
#define nmax 500050

using namespace std;

int n, m, i, x, a, b;
int ai[nmax];
int start, finish, pos, maxx, value;

void tree_update(int node, int left, int right)
{
    if(left==right)
    {
        ai[node]=value;
        return;
    }

    int mid=(left+right)/2;

    if(pos<=mid) tree_update(2*node, left, mid);
        else tree_update(2*node+1, mid+1, right);

    ai[node]=max(ai[2*node], ai[2*node+1]);
}

void tree_query(int node, int left, int right)
{
    if(start<=left && right<=finish)
    {
        if(maxx<ai[node]) maxx=ai[node];
        return;
    }
    int mid=(left+right)/2;
    if(start<=mid) tree_query(2*node, left, mid);
    if(mid<=start) tree_query(2*node+1, mid+1, right);

}

int main()
{
    freopen("arbint.in", "rt", stdin);
    freopen("arbint.out", "wt", stdout);

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

    for(i=1; i<=n; ++i)
    {
        scanf("%d", &x);
        pos=i; value=x;
        tree_update(1, 1, n);
    }

    for(i=1; i<=m; ++i)
    {
        scanf("%d%d%d", &x, &a, &b);
        if(x)
        {
            pos=a; value=b;
            tree_update(1, 1, n);
        }
        else
        {
            maxx=-1;
            start=a; finish=b;
            tree_query(1, 1, n);

            printf("%d\n", maxx);
        }
    }
    return 0;
}