Cod sursa(job #1414359)

Utilizator stefantrettTrett Stefan stefantrett Data 2 aprilie 2015 15:56:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>
#include <algorithm>
#include <iostream>
#define nMax 100001

using namespace std;

int n, m;
int MaxArb[4*nMax+66];
int start, finish;
int val, poz, maxim;

void Update(int nod, int left, int right)
{
    if(left == right)
    {
        MaxArb[nod] = val;
        return;
    }

    int mij = (right + left)/2;
    if(poz <= mij)
        Update(2*nod, left, mij);
    else
        Update(2*nod+1, mij+1, right);
    MaxArb[nod] = max( MaxArb[2*nod], MaxArb[2*nod+1] );
}

void Query(int nod, int left, int right)
{
    if( left >= start && finish >= right)
    {
        maxim = max(maxim, MaxArb[nod]);
        return;
    }

    int mij = (left + right)/2;
    if(start <= mij) Query(2*nod, left, mij);
    if(mij < finish) Query(2*nod+1, mij+1, right);
}

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

    scanf("%d %d\n", &n, &m);
    int x;
    for(int i=1; i<=n; ++i)
    {
        scanf("%d ", &x);
        poz = i;
        val = x;
        Update(1, 1, n);
    }
    scanf("\n");

    for(int i=1; i<=m; ++i)
    {
        int chs, a, b;
        scanf("%d %d %d\n", &chs, &a, &b);
        if(chs == 0)
        {
            maxim = -1;
            start = a;
            finish = b;
            Query(1, 1, n);
            printf("%d\n", maxim);
        }
        else if(chs == 1)
        {
            val = b;
            poz = a;
            Update(1, 1, n);
        }
    }
    return 0;
}