Cod sursa(job #3163254)

Utilizator calin06calin mihaescu calin06 Data 31 octombrie 2023 10:04:13
Problema Arbori de intervale Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <climits>

using namespace std;

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

const int nmax = 10;
int n, q, a[4 * nmax],sol;

void build(int nod, int st, int dr)
{
    if (st == dr)
        fin >> a[nod];
    else
    {
        int mid = (st + dr) / 2;
        build(nod * 2 , st , mid);
        build(nod * 2 + 1,mid + 1,dr);
        a[nod] = max(a[nod * 2],a[nod * 2 + 1]);
    }
}

void update(int nod,int st,int dr,int poz,int val)
{
    if(st == dr)
        a[nod] = val;
    else
    {
        int mid = (st + dr) / 2;
        if(poz <= mid)
            update(nod * 2,st,mid,poz,val);
        if(poz > mid)
            update(nod * 2 + 1,mid + 1,dr,poz,val);
        a[nod] = max(a[nod * 2],a[nod * 2 + 1]);
    }
}

void query(int nod,int st,int dr,int poz_st,int poz_dr)
{
    if(poz_st <= st && dr <= poz_dr)
       sol = max(sol,a[nod]);
    else
    {
        int mid = (st + dr) / 2;
        if(poz_st <= mid)
            query(2 * nod,st,mid,poz_st,poz_dr);
        if(mid < poz_dr)
            query(2 * nod + 1,mid + 1,dr,poz_st,poz_dr);
        a[nod] = max(a[2 * nod],a[2 * nod + 1]);
    }
}

int main()
{
    fin>>n>>q;
    build(1,1,n);

    for(int i = 1;i <= q;i++)
    {
        int tip;
        fin>>tip;

        if(tip == 0)
        {
            int st,dr;
            fin>>st>>dr;
            ///query
            sol = INT_MIN;
            query(1,1,n,st,dr);
            fout<<sol<<"\n";
        }
        else
        {
            int poz,val;
            fin>>poz>>val;
            ///update
            update(1,1,n,poz,val);
        }
    }
}