Cod sursa(job #2657000)

Utilizator Marius7122FMI Ciltea Marian Marius7122 Data 9 octombrie 2020 14:17:55
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
 
using namespace std;

const int N = 100005;

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

int n, m;
int maxArb[N * 4];

void setValue(int index, int val, int left=1, int right=n, int node=1)
{
    if(left == right)
    {
        maxArb[node] = val;
        return;
    }

    int mid = (left + right) / 2;
    if(index <= mid)
        setValue(index, val, left, mid, 2*node);
    else
        setValue(index, val, mid+1, right, node * 2 + 1);

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

int query(int start, int finish, int left=1, int right=n, int node=1)
{
    if(start <= left && right <= finish)
        return maxArb[node];

    int mid = (left + right) / 2;
    int ans = 0;
    if(start <= mid)
        ans = max(ans, query(start, finish, left, mid, node * 2));
    if(finish > mid)
        ans =  max(ans, query(start, finish, mid+1, right, node * 2 + 1));
    return ans;
}

int main()
{
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        int x;
        fin >> x;
        setValue(i, x);
    }

    for(int i = 0; i < m; i++)
    {
        int type, x, y;
        fin >> type >> x >> y;
        if(type == 0)
            fout << query(x, y) << '\n';
        else
            setValue(x, y);
    }
}