Cod sursa(job #2953613)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 11 decembrie 2022 19:33:05
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

long long int n, q, aint[400005];

long long int join(long long int a, long long int b)
{
    return max(a, b);
}

void update (long long int x, long long int poz, long long int st, long long int dr, long long int cr)
{
    if(st==dr) {aint[cr]=x; return;} ///cazul special, care este in frunza

    int mid=(st+dr)/2;
    if(poz<=mid) update(x, poz, st, mid ,2*cr);
    else update(x, poz, mid+1, dr, 2*cr+1);

    aint[cr]=join(aint[2*cr], aint[2*cr+1]);
}

long long int bunicaLuiFred(long long int qst, long long int qdr, long long int st, long long int dr, long long int cr)
{
    if(st==qst && dr==qdr) return aint[cr];

    int mid=(st+dr)/2;
    if(qdr<=mid) return bunicaLuiFred(qst, qdr, st, mid, 2*cr);
    if(qst>mid) return bunicaLuiFred(qst, qdr, mid+1, dr, 2*cr+1);

    return join(bunicaLuiFred(qst, mid, st, mid, 2*cr), bunicaLuiFred(mid+1, qdr, mid+1, dr, 2*cr+1));
}

int main()
{
    ifstream cin("arbint.int");
    ofstream cout("arbint.out");
    cin>>n>>q;
    for(int i=1; i<=n ;i++)
    {
        long long int x;
        cin>>x;
        update(x, i, 1, n, 1);
    }
    while(q--)
    {
        long long int t;
        cin>>t;
        if(t==0)
        {
            long long int l, r;
            cin>>l>>r;
            cout<<bunicaLuiFred(l, r, 1, n, 1)<<'\n';
        }
        else
        {
            long long int poz, x;
            cin>>poz>>x;
            update(x, poz, 1, n, 1);
        }
    }
    return 0;
}