Cod sursa(job #2821907)

Utilizator alextheseal1240Alex Vladu alextheseal1240 Data 23 decembrie 2021 12:06:10
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#define inf 0x3f3f3f3f
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[100001];
int a[400004];
int n, q;
void read()
{
    fin >> n >> q;
    for(int i=1; i<=n; i++)
        fin >> v[i];
}
void creare(int st, int dr, int nod)
{
    if(st==dr)
    {
        a[nod]=v[st];
        return;
    }
    int mid=(st+dr)/2;
    creare(st, mid, 2*nod), creare(mid+1, dr, 2*nod+1);
    a[nod]=max(a[2*nod], a[2*nod+1]);
}
void update(int st, int dr, int poz, int value, int nod)
{
    int mid=(st+dr)/2;
    if(st==dr)
    {
        a[nod]=value;
        return;
    }
    if(st<=poz && poz<=mid)
        update(st, mid, poz, value, 2*nod);
    if(mid+1<=poz && poz<=dr)
        update(mid+1, dr, poz, value, 2*nod+1);
    a[nod]=max(a[2*nod], a[2*nod+1]);
}
int rmq(int st, int dr, int x, int y, int nod)
{
    if(y<st || x>dr)
        return 0;
    if(x<=st && dr<=y)
        return a[nod];
    int mid=(st+dr)/2;
    return max(rmq(st, mid, x, y, 2*nod), rmq(mid+1, dr, x, y, 2*nod+1));
}
int main()
{
    read();
    creare(1, n, 1);
    for(int i=1, cer, x, y; i<=q; i++)
    {
        fin >> cer >> x >> y;
        if(cer==1)
            update(1, n, x, y, 1);
        else
            fout << rmq(1, n, x, y, 1) << "\n";
    }
    return 0;
}