Cod sursa(job #2701265)

Utilizator codruta.miron08Miron Ioana Codruta codruta.miron08 Data 30 ianuarie 2021 11:44:18
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
int tree[400005],v[100005];
void constr(int st,int dr, int node)
{
    if(st == dr)
    {
        tree[node] = v[st];
    }
    else
    {
        int mij = (st + dr)/2;
        constr(st,mij,2* node);
        constr(mij + 1,dr,2* node + 1);
        tree[node] = max(tree[2*node],tree[2* node + 1]);
    }

}
void update(int st,int dr,int node, int a, int b)
{
    if(st == dr)
    {
        v[a] = b;
        tree[node] = b;
    }
    else
    {
        int mij = (st + dr)/2;
        if(a <= mij)
            update(st,mij,2*node,a,b);
        else
            update(mij + 1,dr, 2* node + 1,a,b);
        tree[node] = max(tree[2*node],tree[2*node + 1]);
    }

}
int query(int st,int dr, int node,int a, int b)
{
    if(st > b || dr < a)
        return 0;
    if(st >= a && dr <= b)
        return tree[node];

        int mij = (st + dr)/2;
        int q1 =query(st, mij, 2 * node, a, b);
        int q2 = query(mij + 1, dr, 2 * node + 1, a, b);
        return max(q1,q2);


}

void read()
{
    fin >> n >> m;
    for(int i = 1; i <= n; ++i)
        fin >> v[i];
    constr(1,n,1);
    for(int i = 0; i < m; ++i)
    {
        int t,a,b;
        fin >> t >> a >> b;
        if(t == 0)
            fout << query(1,n,1,a,b) << "\n";
        else
            update(1,n,1,a,b);
    }
}
int main()
{
    read();

    return 0;
}