Cod sursa(job #2218670)

Utilizator HumikoPostu Alexandru Humiko Data 5 iulie 2018 13:42:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>
#define nmax 100005

using namespace std;

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

int n, m, instruction, first_Value, second_Value, current_Index, value, maximum;
int interval_Tree[4*nmax];

void update ( int node, int left, int right )
{
    if ( left == right )
    {
        interval_Tree[node] = value;
        return;
    }
    int middle = left+(right-left)/2;
    if ( current_Index <= middle )
        update(2*node, left, middle);
    else
        update(2*node+1, middle+1, right);
    interval_Tree[node] = max(interval_Tree[2*node], interval_Tree[2*node+1]);
}

int query ( int node, int left, int right, int a, int b )
{
    if ( left >= a && right <= b )
        return interval_Tree[node];
    int middle = left+(right-left)/2;
    if ( a <= middle )
        maximum = max(maximum, query(2*node, left, middle, a, b));
    if ( middle < b )
        maximum = max(maximum, query(2*node+1, middle+1, right, a, b));
    return maximum;
}

int main()
{
    fin>>n>>m;
    for ( int i = 1; i <= n; ++i )
    {
        fin>>value;
        current_Index = i;
        update(1, 1, n);
    }
    for ( int i = 1; i <= m; ++i )
    {
        fin>>instruction>>first_Value>>second_Value;
        if ( instruction == 0 )
        {
            maximum = 0;
            fout<<query(1, 1, n, first_Value, second_Value)<<'\n';
        }
        else
        {
            current_Index = first_Value;
            value = second_Value;
            update(1, 1, n);
        }
    }
}