Cod sursa(job #3241888)

Utilizator Federica361Martinut Federica Federica361 Data 5 septembrie 2024 17:01:31
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;

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

#define cin fin
#define cout fout

#define DIM 400005

int arbint[DIM];
int N, M, nr, a, b, x, y, tip;

void update(int poz, int val, int nod, int in, int sf)
{
    if(in == sf)
    {
        if(in == poz)
            arbint[nod] = val;
        return ;
    }
    int mij = (in + sf) / 2;
    if(in <= poz && poz <= mij)
        update(poz, val, 2 * nod, in, (in + sf) / 2);
    if(mij < poz && poz <= sf)
        update(poz, val, 2 * nod + 1, (in + sf) / 2 + 1, sf);
    arbint[nod] = max(arbint[nod * 2], arbint[nod * 2 + 1]);
}

int query(int st, int dr, int nod, int in, int sf)
{
    if(st <= in && sf <= dr)
        return arbint[nod];
    int mij = (in + sf) / 2;
    if(mij < st)
        return query(st, dr, 2 * nod + 1, mij + 1, sf);
    if(mij >= dr)
        return query(st, dr, 2 * nod, in, mij);
    return max(query(st, dr, 2 * nod, in, mij), query(st, dr, 2 * nod + 1, mij + 1, sf));
}


int main() {


    cin>>N>>M;
    for(int i = 1; i <= N; ++i)
    {
        cin>>nr;
        update(i, nr, 1, 1, N);
    }
    for(int i = 1; i <= M; ++i)
    {
        cin>>tip;
        if(tip == 0)
        {
            cin>>x>>y;
            cout << query(x, y, 1, 1, N) << '\n';
        }
        else
        {
            cin>>a>>b;
            update(a, b, 1, 1, N);
        }
    }
    return 0;
}