Cod sursa(job #2686158)

Utilizator Robert.BrindeaBrindea Robert Robert.Brindea Data 18 decembrie 2020 16:48:59
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

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

const int MAXN = 100003;
const int MAXS = sqrt(MAXN) + 3;

int n, m, a[MAXN], b[MAXS], s;

void build()
{
    for(int i = 1; i <= n; i++)
    {
        int j = i/s;
        b[j] = max(b[j], a[i]);
    }
}

void update(int pos, int val)
{
    a[pos] = val;
    int j = pos/s;
    b[j] = 0;
    for(int i = j*s; i <= (j+1)*s -1; i++)
        b[j] = max(b[j], a[i]);
}

int query(int l, int r)
{
    int jl = l/s, jr = r/s;
    int mx = 0;

    if(jl == jr)
    {
        if(l == jl*s && r == (jr+1)*s-1)
            return b[jl];
        for(int i = l; i <= r; i++)
            mx = max(mx, a[i]);
        return mx;
    }

    if(l == jl*s)
        mx = max(mx, b[jl]);
    else
        for(int i = l; i <= (jl+1)*s-1; i++)
            mx = max(mx, a[i]);

    for(int j = jl+1; j < jr; j++)
        mx = max(mx, b[j]);

    if(r == (jr+1)*s-1)
        mx = max(mx, b[jr]);
    else
        for(int i = jr*s; i <= r; i++)
            mx = max(mx, a[i]);

    return mx;
}

int main()
{
    fin >> n >> m;
    s = sqrt(n);
    for(int i = 1; i <= n; i++)
        fin >> a[i];
    build();
    for(int i = 0; i < m; i++)
    {
        int tip, x, y;
        fin >> tip >> x >> y;
        if(tip == 1)
            update(x, y);
        else
            fout << query(x, y) << "\n";
    }
    return 0;
}