Cod sursa(job #2469660)

Utilizator alisavaAlin Sava alisava Data 7 octombrie 2019 20:18:08
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
#define Lson(x) (x * 2)
#define Rson(x) (x * 2 + 1)


using namespace std;

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

int v[100005], aint[200005], n;
int raspuns;

void Build(int left, int right, int node)
{
    if(left == right)
    {
        aint[node] = v[left];
        return;
    }
    int mid = (left + right) / 2;
    Build(left, mid, Lson(node));
    Build(mid + 1, right, Rson(node));
    aint[node] = max(aint[Lson(node)], aint[Rson(node)]);
}

void Update(int left, int right, int node, const int &val, const int &poz)
{
    if(left == right)
    {
        aint[node] = val;
        return;
    }
    int mid = (left + right) / 2;
    if(poz <= mid)
        Update(left, mid, Lson(node), val, poz);
    else
        Update(mid + 1, right, Rson(node), val, poz);
    aint[node] = max(aint[Lson(node)], aint[Rson(node)]);
}

void Query(int left, int right, int node, const int &RQuery, const int &LQuery)
{
    if(LQuery <= left && right <= RQuery)
    {
        raspuns = max(raspuns,aint[node]);
        return;
    }
    int mid = (left + right) / 2;
    if(LQuery <= mid)
        Query(left, mid, Lson(node), RQuery, LQuery);
    if(mid < RQuery)
        Query(mid + 1, right, Rson(node), RQuery, LQuery);
}


int main()
{
    int task, m, Lq,Rq, poz, val;
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> v[i];
    Build(1, n, 1);

    for(int i = 1; i <= m; i++)
    {
        fin >> task;
        if(task == 0)
        {
            fin >> Lq >> Rq;
            raspuns = 0;
            Query(1, n, 1, Rq, Lq);
            fout << raspuns << "\n";
        }
        else
        {
            fin >> poz >> val;
            Update(1, n, 1, val ,poz);
        }
    }

    return 0;
}