Cod sursa(job #2242653)

Utilizator roberttrutaTruta Robert roberttruta Data 19 septembrie 2018 10:05:40
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>

using namespace std;
int n,m,v[100002],arb[1000000],Max,a,b,c;
void build(int nod, int s, int d, int mij)
{
    if(s==d)
    {
        arb[nod]=v[s];
        return ;
    }
    mij=(s+d)/2;
    build(nod*2,s,mij,mij);
    build(nod*2+1,mij+1,d,mij);
    arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
void modif(int nod, int s, int d, int mij)
{
    if(s==d)
    {
        arb[nod]=b;
        return ;
    }
    mij=(s+d)/2;
    if(a<=mij)
        modif(nod*2,s,mij,mij);
    else
        modif(nod*2+1,mij+1,d,mij);
    arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
void raspuns(int nod, int s, int d, int mij)
{
    if(a<=s && b>=d)
    {
    if(arb[nod]>Max)
        Max=arb[nod];
        return ;
    }
    mij=(s+d)/2;
    if(a<=mij)
        raspuns(nod*2,s,mij,mij);
    if(b>mij)
        raspuns(nod*2+1,mij+1,d,mij);
}
int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
int i;
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>v[i];
    build(1,1,n,0);

   for(i=1;i<=m;i++)
    {
        f>>c>>a>>b;
        if(c==1)
            modif(1,1,n,0);
        else
        {
            Max=0;
            raspuns(1,1,n,0);
            g<<Max<<'\n';
        }
    }
    return 0;
}