Cod sursa(job #2904714)

Utilizator florina15Florina florina15 Data 18 mai 2022 00:47:17
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int a[100005], n, m, operatie, i, j, st, dr, dim, st2, dr2, maxim[350];

int f1(int p)
{
    if(p % dim == 0)
        return p/dim;
    return p/dim+1;
}

void modif(int p, int v)
{
    a[p] = v;
    int nr = f1(p), i;
    maxim[nr] = 0;
    i = (nr-1)*dim+1;
    while(i <= nr*dim)
        {
            maxim[nr]=max(maxim[nr],a[i]);
            i++;
        }
}
int f2(int st, int dr)
{
    int nr1 = f1(st);
    int nr2 = f1(dr);
    int x = 0;
    if(nr1 == nr2)
    {
        int i;
        for(i = st; i <= dr; i++)
            x = max(x, a[i]);
    }
    else
        {
            int i;
        for(i = nr1 + 1; i < nr2; i++)
            x = max(x, maxim[i]);
        for(i = st;i <= nr1 * dim; i++)
            x = max(x, a[i]);
        for(i=(nr2-1)*dim+1;i<=dr; i++)
            x = max(x, a[i]);
    }
    return x;
}
int main()
{
    f>>n>>m;

    dim = sqrt(n);

    for(i=1;i<=n;i++)
    {
        f>>a[i];
        maxim[f1(i)] = max(maxim[f1(i)], a[i]);
    }

    while(m--)
    {
        f>>operatie>>st>>dr;
        if(!operatie)
            g<<f2(st, dr)<<endl;
        else modif(st, dr);
    }
    return 0;
}