Cod sursa(job #2310426)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 31 decembrie 2018 15:52:45
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
#define Dim 1000008
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
long Arb[2*Dim+1],N,M,V[Dim],a,b,maxim,lop;
int op;

void Update(int st,int dr,int nod)
{
    if(st==dr)
    {
        Arb[nod]=V[st];
        return;
    }
    int mij=(st+dr)/2;
    Update(st,mij,2*nod);
    Update(mij+1,dr,2*nod+1);
    Arb[nod]=max(Arb[2*nod],Arb[2*nod+1]);
}

void Update1(int st,int dr,int nod)
{
    if(st==dr&&dr==a)
    {
        Arb[nod]=b;
        return;
    }
    int mij=(st+dr)/2;
    if(a<=mij)
        Update1(st,mij,2*nod);
    else
        Update1(mij+1,dr,2*nod+1);
    Arb[nod]=max(Arb[2*nod],Arb[2*nod+1]);
}

void Query(int st,int dr,int nod)
{
    if(st>=a&&dr<=b)
    {
        maxim=max(maxim,Arb[nod]);
        if(dr==b)
        {
            g<<maxim<<'\n';
            return;
        }
    }
    else
    {
        int mij=(st+dr)/2;
    if(a<=mij)
        Query(st,mij,2*nod);

    if(b>mij)
        Query(mij+1,dr,2*nod+1);

    }
}

int main()
{
    f>>N>>M;
    for(int i=1;i<=N;i++) f>>V[i];
    Update(1,N,1);
    for(int i=1;i<=M;i++)
    { lop=i;
        f>>op;
        if(op)
        {
            f>>a>>b;
            Update1(1,N,1);

        }else
        {
            maxim=0;
            f>>a>>b;
            Query(1,N,1);
        }

    }
    return 0;
}