Cod sursa(job #2378380)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 12 martie 2019 09:34:50
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100002;

int tree[4 * NMAX];
int a[NMAX];
int N,Q;

void Update(int nod, int lf, int rg, int pos, int val)
{
    if ( lf == rg)
    {
        tree[nod] = val;
        return ;
    }

    int mid = ( lf + rg ) / 2;

    if(pos <= mid) Update(nod * 2, lf , mid, pos, val);
    else Update( nod * 2 + 1, mid + 1, rg, pos , val);

    tree[nod] = max ( tree[nod * 2], tree[nod * 2 + 1]);

}

int Query(int nod, int lf, int rg, int L, int R)
{
    if(L <= lf && rg <= R)
        return tree[nod];

    int mid = ( lf + rg ) / 2;

    int ans1,ans2;
    ans1=ans2=0;

    if(L <= mid) ans1 = Query(nod * 2, lf, mid, L, R);
    if( R > mid) ans2 = Query(nod * 2 + 1, mid + 1, rg, L, R);

    return max(ans1,ans2);

}
int x, y, task;
void Read()
{
    fin >> N >> Q;
    for(int i=1;i<=N;++i)
    {
        fin >> a[i];
        Update(1,1,N,i,a[i]);
    }

    for(int i=1;i<=Q;++i)
    {
        fin >> task >> x >> y;
        if( task == 1)
        {
            Update(1,1,N,x,y);
        }
        else
        {
            fout << Query(1,1,N,x,y) << "\n";
        }
    }
}
int main()
{
    Read();
    return 0;
}