Cod sursa(job #2764888)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 23 iulie 2021 10:24:43
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
#include <fstream>
#include <deque>

#define MOD 666013

using namespace std;

ifstream cin ("arbint.in");
ofstream cout ("arbint.out");

struct nod
{

    int a, b, val = 0 ;

    nod *st, *dr ;

};

int v[100009] ;

nod *creeaza(nod *&head, int st, int dr)
{

    head = new nod ;

    if(st == dr)
    {

        head -> a = st ;
        head -> b = st ;

        head -> val = v[st] ;

        return head ;

    }

    head -> st = creeaza(head -> st, st, st + (dr - st) / 2) ;
    head -> dr = creeaza(head -> dr, st + (dr - st) / 2 + 1, dr) ;

    head -> a = st ;
    head -> b = dr ;

    head -> val = max(head -> st -> val, head -> dr -> val) ;

    return head ;

}

int check(nod *head, int st, int dr)
{

    if(head -> a == st &&
        head -> b == dr)
        return head -> val ;

    if(dr <= head -> st -> b)
        return check(head -> st, st, dr) ;

    if(st >= head -> dr -> a)
       return check(head -> dr, st, dr) ;

    return max(check(head -> st, st, head -> st -> b),
    check(head -> dr, head -> dr -> a, dr));

}

void update(nod *head, int poz, int x)
{

    if(head -> a == poz &&
       head -> b == poz)
    {

        head -> val = x ;

        v[poz] = x ;

        return ;

    }

    if(poz <= head -> st -> b)
    {
        update(head -> st, poz, x) ;

        head -> val = max(head -> st -> val, head -> dr -> val) ;

        return ;
    }

    update(head -> dr, poz, x) ;

    head -> val = max(head -> st -> val, head -> dr -> val) ;

    return ;

}

int main()
{

    int n, q ;

    cin >> n >> q ;

    for(int f = 1 ; f <= n ; f ++)
        cin >> v[f] ;

    nod *head ;

    creeaza(head, 1, n) ;

    while(q --)
    {

        int a, b, c ;

        cin >> a >> b >> c ;

        if(a == 0)
        {

            cout << check(head, b, c) << '\n' ;

        }
        else update(head, b, c) ;

    }

    return 0 ;

}
/*

5
abade
1 2
1 4
2 4

*/