Cod sursa(job #2701254)

Utilizator codruta.miron08Miron Ioana Codruta codruta.miron08 Data 30 ianuarie 2021 11:25:43
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 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,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;
}