Cod sursa(job #2432879)

Utilizator alisavaAlin Sava alisava Data 25 iunie 2019 13:13:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
#define Ls(x) (x * 2)
#define Rs(x) (x * 2 + 1)
#define Nmax 100005

using namespace std;

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

int aint[Nmax * 4];
int v[Nmax];
int answer;
int n, m;

void Build(int left, int right, int node)
{
    if(right == left)
    {
        aint[node] = v[left];
        return;
    }
    int m = (left + right) / 2;
    Build(left, m, Ls(node));
    Build(m + 1, right, Rs(node));
    aint[node] = max(aint[Ls(node)], aint[Rs(node)]);
}

void Update(const int &pos, const int &x, int left, int right, int node)
{
    if(left == right)
    {
        aint[node] = x;
        return;
    }
    int m = (left + right) / 2;
    if(pos <= m)
        Update(pos, x, left, m, Ls(node));
    else
        Update(pos, x, m + 1, right, Rs(node));
    aint[node] = max(aint[Ls(node)], aint[Rs(node)]);
}

void Query(const int &Qleft, const int &Qright, int left,int right,int node)
{
    if(Qleft <= left && right <= Qright)
    {
        answer = max(answer,aint[node]);
        return;
    }
    int m = (left + right) / 2;
    if(Qleft <= m)
        Query(Qleft, Qright, left, m, Ls(node));
    if(Qright >= m + 1)
        Query(Qleft, Qright, m + 1, right, Rs(node));


}


int main()
{
    int c, x, y;
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> v[i];
    Build(1,n,1);
    for(int i = 1; i <= m; i++)
    {
        fin >> c >> x >> y;
        if(c == 0)
        {
            answer = -1;
            Query(x, y, 1, n, 1);
            fout << answer << "\n";
        }
        else
            Update(x,y,1,n,1);
    }
    return 0;
}