Cod sursa(job #2702535)

Utilizator cristia_razvanCristia Razvan cristia_razvan Data 4 februarie 2021 14:14:25
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>
#define NMAX 100000
using namespace std;

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

int n, m;
int a[NMAX + 1];
int arbint[4 * NMAX + 1];

inline int op(int x, int y)
{
    return max(x, y);
}

void Build(int node, int left, int right)
{
    if(left == right)
        arbint[node] = a[left];
    else  
    {
        int mid = ((left + right) >> 1);
        Build((node << 1), left, mid);
        Build(((node << 1) | 1), mid + 1, right);
        arbint[node] = op(arbint[(node << 1)], arbint[((node << 1) | 1)]);
    }
}

void Update(int node, int left, int right, int poz, int val)
{
    if(left == right)
        arbint[node] = val;
    else 
    {
        int mid = ((left + right) >> 1);
        if(poz <= mid)
            Update((node << 1), left, mid, poz, val);
        else Update(((node << 1) | 1), mid + 1, right, poz, val);
        arbint[node] = op(arbint[(node << 1)], arbint[((node << 1) | 1)]);
    }
}

int Query(int node, int left, int right, int x, int y)
{
    if(left > y || right < x)
        return -1;
    if(left >= x && right <= y)
        return arbint[node];
    int mid = ((left + right) >> 1);
    int q1 = Query((node << 1),left, mid, x, y);
    int q2 = Query(((node << 1) | 1), mid + 1, right, x, y);
    return op(q1, q2);
}

int main()
{   
    int op, x, y;

    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> a[i];
    Build(1, 1, n);
    for(int i = 1; i <= m; i++)
    {
        fin >> op >> x >> y;
        if(op == 0)
            fout << Query(1, 1, n, x, y) << "\n";
        else Update(1, 1, n, x, y);
    }
    fin.close();
    fout.close();
    return 0;
}