Cod sursa(job #3245066)

Utilizator seby1337Goran Sebastian-Alexandru seby1337 Data 27 septembrie 2024 10:41:09
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
#define pb push_back
#define ll long long
#define pi pair<int, int>
#define ff first
#define ss second
using namespace std;

const string file = "arbint";
ifstream fin(file+".in");
ofstream fout(file+".out");

const int dim = 1e5+1;
int i, n, m, a[2*dim], rez[4*dim];

void update(int nod)
{
    while (nod != 0)
    {
        rez[nod] = max(rez[nod*2], rez[nod*2+1]);
        nod /= 2;
    }
}

int query(int nod, int st, int dr, int qst, int qdr)
{
    if (qst <= st && dr <= qdr)
        return rez[nod];
    int mij = (st+dr)/2, mx = 0;
    if (qst <= mij)
        mx = query(nod*2, st, mij, qst, qdr);
    if (mij+1 <= qdr)
        mx = max(mx, query(nod*2+1, mij+1, dr, qst, qdr));
    return mx;
}

int main()
{
    fin >> n >> m;
    for (i = 1; i <= n; i++)
        fin >> a[i];
    int p = 0;
    while ((1<<p) < n)
        p++;
    n = (1<<p);
    for (i = 1; i <= n; i++)
    {
        rez[i+n-1] = a[i];
        update((i+n-1)/2);
    }
    int tip, st, dr;
    while (m--)
    {
        fin >> tip >> st >> dr;
        //cout << "tip, st, dr = " << tip << ' ' << st << ' ' << dr << endl;
        if (tip == 1)
        {
            rez[st+n-1] = dr;
            update((st+n-1)/2);
        }
        else
            fout << query(1, 1, n, st, dr) << '\n';
    }
    return 0;
}