Cod sursa(job #843320)

Utilizator alexalbu95Albu Alexandru alexalbu95 Data 27 decembrie 2012 19:47:47
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int A[100005], x, poz, val, start, finish, maxim, nr, k;

void update(int nod, int st, int dr)
{
    if(st==dr)
    {
        A[nod]=val;
        return;
    }

    int med=st+(dr-st)/2;

    if(poz<=med) update(2*nod, st, med);
    else update(2*nod+1, med+1, dr);

    A[nod]= max( A[2*nod], A[2*nod+1] );
}

void query(int nod, int st, int dr)
{
    if(start<=st && dr<=finish)
    {
        maxim=max(maxim, A[nod]);
        return;
    }

    int med=st+(dr-st)/2;

    if(start <= med) query(2*nod, st, med);
    if(med < finish) query(2*nod+1, med+1, dr);
}

int main()
{
    int n, m;

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

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

    for(int i=1; i<=n; ++i)
    {
       scanf("%d", &x);
       poz=i; val=x;
       update(1, 1, n);
    }
    for(; m; --m)
    {
        scanf("%d %d %d", &x, &start, &finish);
        if(x==0)
        {
            maxim=-1;
            query(1, 1, n);

            printf("%d\n", maxim);
        }
        else
        {
            poz=start;
            val=finish;
            update(1, 1, n);
        }
    }
}