Cod sursa(job #2990319)

Utilizator TanasaStefanTanasa Stefan TanasaStefan Data 7 martie 2023 19:30:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>

using namespace std;

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

int n , m , v[100010] , arbore[400005] , maxim;

void build ( int nod , int left , int right)
{
    if(left == right)
    {
        arbore[nod] = v[left];
        return;
    }
    int mij = (left + right) / 2;
    build(2 * nod  , left , mij);
    build(2 * nod  + 1 , mij + 1 , right);
    arbore[nod] = max( arbore[nod * 2] , arbore[2 * nod  + 1]);
}

void update(int nod , int left , int right , int pos , int val)
{
    if (left == right)
    {
        arbore[nod] = val;
        return;
    }

    int mij = (left + right) / 2;

    if(pos <= mij)
        {
            update(nod * 2 , left , mij , pos , val);
        }
        else
        {
            update(2 * nod  + 1 , mij + 1 , right , pos , val);
        }

    arbore[nod] = max( arbore[nod * 2] , arbore[2 * nod  + 1]);
}

void query(int nod , int left , int right , int st , int dr)
{
    if(st <= left && right <= dr)
    {
        if(maxim < arbore[nod])
            maxim = arbore[nod];
            return ;
    }

    int mij = (left + right) / 2;
    int ans1 = 0 , ans2 = 0;
    if(st <= mij)
         query(nod * 2 , left , mij , st , dr);
    if(dr > mij)
        query(nod * 2 + 1, mij + 1 , right , st , dr);
}
int main()
{
    f >> n >> m;
    for( int i = 1 ; i <= n ; i++)
    {
        f >> v[i];
    }
    build(1 , 1 , n);
    for ( int i = 1 ; i <= m ; i++)
    {
        int cerinta = 0 , a = 0 , b = 0;
        f >> cerinta >> a >> b;
        if(cerinta == 0)
        {
            maxim = -1;
            query(1 , 1 , n , a , b) ;
            g << maxim << '\n';

        }
        else
            update(1 , 1 , n , a , b);
    }
}