Cod sursa(job #1825566)

Utilizator vladbatalanBatalan Vlad vladbatalan Data 9 decembrie 2016 13:50:24
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <iostream>
#include <cstdlib>

#define dim 100001

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m, arb[4*dim + 66], val, pos, X, A, B, maxim, start, finish, N;

void Update(int nod, int left, int right)
{
    if(left==right)
    {
        arb[nod] = val;
        return;
    }
    int mid = (left+right)/2;
    if(pos<=mid) Update(nod*2, left, mid);
    else Update(nod*2+1, mid+1, right);
    arb[nod] = max(arb[nod*2], arb[nod*2+1]);
}

int Query(int nod, int left, int right)
{

    if(start<=left && right<=finish)
        return arb[nod];
    if(right<start || left>finish)
        return -1000000;
    int mid=(left+right)/2;
    return max(Query(nod*2, left, mid), Query(nod*2+1, mid+1, right));
}

int main()
{
    fin>>n>>m;
    for(N=1; N<n; N<<=1);
    for(int i=1; i<=n; i++)
    {
        fin>>val;
        pos = i;
        Update(1,1,N);
    }
    while(m--)
    {
        fin>>X>>A>>B;
        if(X==0)
        {
            start = A;
            finish = B;
            fout<<Query(1,1,N)<<'\n';
        }
        else
        {
            pos=A;
            val=B;
            Update(1,1,N);
        }
    }
    return 0;
}