Cod sursa(job #2805825)

Utilizator namesurname01Name Surname namesurname01 Data 22 noiembrie 2021 02:15:57
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <cstdio>
#include <iostream>

using namespace std;
FILE* f, * g;

int arbore[400002];
int n, m, where, x, maa;

void ma(int a, int b, int st, int dr, int nod)
{
    int mij;
    if (a <= st && dr <= b)
    {
        maa = max(maa, arbore[nod]);
    }
    else//trebuie sa verific daca intervalul din fiul stang se gaseste in [a;b] sau cel din fiul drept
    {
        mij = (st + dr) / 2;
        if (a <= mij)//caut in fiul stang maximul
            ma(a, b, st, mij, 2 * nod);
        if (mij < b)//caut si in fiul drept maximul
            ma(a, b, mij + 1, dr, 2 * nod + 1);
    }
}
void det(int nod, int st, int dr)
{
    int mij;
    if (st == dr)
    {
        arbore[nod] = x;
        return;
    }
    else
    {
        mij = (st + dr) / 2;
        if (where <= mij)
            det(2 * nod, st, mij);//fiul stang
        else
            det(2 * nod + 1, mij + 1, dr);//fiul drept
    }
    arbore[nod] = max(arbore[2 * nod], arbore[2 * nod + 1]);//elementul maxim dintre prima jmatate si a 2 a, dintre fiul stang si cel drept
}
int main()
{
    f = fopen("arbint.in", "r");
    g = fopen("arbint.out", "w");
    fscanf(f, "%d %d", &n, &m);
    for (int i = 1;i <= n;++i)
    {
        fscanf(f, "%d", &x);
        where = i;//ma ajuta sa vad daca x face parte din fiul stang sau fiul drept
        det(1, 1, n);
    }
    //for(int i=1;i<=10;++i)
    // fprintf(g,"%d ",arbore[i]);
    int type, a, b;
    for (int i = 1;i <= m;++i)
    {
        fscanf(f, "%d %d %d", &type, &a, &b);
        if (type)
        {
            where = a;
            x = b;
            det(1, 1, n);
        }
        else
        {
            maa = 0;
            ma(a, b, 1, n, 1);
            fprintf(g, "%d\n", maa);
        }
    }

    fclose(f);
    fclose(g);
    return 0;
}