Cod sursa(job #2444911)

Utilizator butnaru_vladButnaru Vlad butnaru_vlad Data 1 august 2019 18:48:17
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <climits>
using namespace std;
ifstream in ("divquery.in");
ofstream out ("divquery.out");
int v[100001],a[400004],cmm=0,max1;
void build (int nod,int st,int dr)
{
    if (st==dr)
    {
        a[nod]=v[st];
        return;
    }
    int mij=st+(dr-st)/2;
    build(nod<<1,st,mij);
    build(nod<<1|1,mij+1,dr);
    a[nod]=max(a[nod<<1|1], a[nod<<1]);
}
void raspuns (int nod ,int st,int dr,int l,int r)
{
    if (l<=st && dr<=r)
    {
        max1=max(max1,a[nod]);
        return;
    }
    int mij=st+(dr-st)/2;
    if (mij>=l)
        raspuns(nod<<1,st,mij,l,r);
    if (r>mij)
        raspuns(nod<<1|1,mij+1,dr,l,r);
}
void update (int nod,int st,int dr,int l,int r,int value)
{
    if (st==dr)
    {
        a[nod]=value;
        return;
    }
    int mij=st+(dr-st)/2;
    if (l<=mij)
        update(nod<<1,st,mij,l,r,value);
    if (r>mij)
        update(nod<<1|1,mij+1,dr,l,r,value);
    a[nod]=max(a[nod<<1],a[nod<<1|1]);
}
int main()
{
    int n,m;
    in>>n>>m;
    for (int i=1;i<=n;++i)
        in>>v[i];
    build(1,1,n);
    for (int i=1;i<=m;++i)
    {
        int caz;
        in>>caz;
        if (caz==0)
        {
            int l,r;
            in>>l>>r;
            max1=INT_MIN;
            raspuns(1,1,n,l,r);
            out<<max1<<'\n';
        }
        if (caz==1)
        {
            int l,r;
            in>>l>>r;
            update(1,1,n,l,l,r);
        }
    }
    return 0;
}