Cod sursa(job #2757184)

Utilizator seburebu111Mustata Dumtru Sebastian seburebu111 Data 4 iunie 2021 12:12:47
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>

using namespace std;

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

const int INF = 1<<30;
int n, m;
int v[100000];
int t[400000];
int tip;
int a, b;

void actualizare(int p, int st, int dr)
{
    //modifica elem de pe poz poz, dandu-i
    //valoarea val (stiu ca poz <[st, dr]
    if(st==dr)
    {
        t[p]=b;
        return;
    }
    int m=(st+dr)/2;
    if(a<=m)
    {
        actualizare(2*p, st, m);
    }
    else
    {
        actualizare(2*p+1, m+1, dr);
    }
    t[p]=max(t[2*p], t[2*p+1]);
}

int interogare(int p, int st, int dr)
{
    //gaseste max([a,b] intersectat [st, dr])
    if(a<=st && dr<=b)
        return t[p];
    int m=(st+dr)/2, rezst=-INF, rezdr=-INF;
    if(a<=m)
    {
        rezst=interogare(2*p, st, m);
    }
    if(m<b)
    {
        rezdr=interogare(2*p+1, m+1, dr);
    }
    return max(rezst, rezdr);
}

int main()
{
    in>>n>>m;
    for(int i=1; i<=n; i++)
    {
        in>>v[i];
        a=i;
        b=v[i];
        actualizare(1, 1, n);
    }
    while(m--)
    {
        in>>tip;
        in>>a>>b;
        if(tip==1)
        {
            actualizare(1, 1, n);
        }
        else
        {
            out<<interogare(1, 1, n)<<'\n';
        }
    }
    return 0;
}