Cod sursa(job #2405882)

Utilizator EricEric Vilcu Eric Data 15 aprilie 2019 09:40:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int m,n,a[400002],vl,q,z;
int buildtree(int x,int l,int r)
{
    int lr=(l+r)/2;
    if(l==r)f>>a[x];
    else {a[x]=buildtree(2*x,l,lr);a[x]=max(a[x],buildtree(2*x+1,lr+1,r));}
    return a[x];
}
int qr(int x,int l,int r,int b,int e)
{
    if(b<=l&&e>=r)return a[x];
    int mx=0,lr=(l+r)/2;
    if(b<=lr)mx=qr(2*x,l,lr,b,e);
    if(e>lr)mx=max(mx,qr(2*x+1,lr+1,r,b,e));
    return mx;
}
void upd(int x,int l,int r,int dst)
{
    if(r==l){a[x]=vl;return;}
    int lr=(l+r)/2;
    if(dst<=lr)upd(2*x,l,lr,dst);
    else if(dst>lr)upd(2*x+1,lr+1,r,dst);
    a[x]=max(a[2*x],a[2*x+1]);
}
int main()
{
    f>>n>>m;
    buildtree(1,1,n);
    for(;m>0;--m)
    {
        f>>q>>z>>vl;
        if(q==0)g<<qr(1,1,n,z,vl)<<'\n';
        else upd(1,1,n,z);
    }

}