Cod sursa(job #1324716)

Utilizator serban_ioan97Ciofu Serban serban_ioan97 Data 22 ianuarie 2015 18:44:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#define nmax 505050
#include <algorithm>

using namespace std;

int arb[nmax], v[nmax];
int n, m, i, x, y, type;
int maxx;
int value, position;
int start, finish;

void tree_update(int node, int left, int right)
{
    if(left==right)
    {
        arb[node]=value;
        return;
    }
    else
    {
        int mid=(left+right)/2;

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

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

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

        if(start<=mid) tree_query(2*node, left, mid);
        if(mid<finish) 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);
        value=x; position=i;
        tree_update(1, 1, n);
    }

    for(i=1; i<=m; ++i)
    {
        scanf("%d%d%d", &type, &x, &y);

        if(type)
        {
            position=x; value=y;
            tree_update(1, 1, n);
        }
        else
        {
            maxx=-1;
            start=x; finish=y;
            tree_query(1, 1, n);
            printf("%d\n", maxx);
        }
    }
    return 0;
}