Cod sursa(job #2572276)

Utilizator Pompeii_MarinarulHuza Damian Pompeii_Marinarul Data 5 martie 2020 12:22:58
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");

struct nodarb{int s,d,mm;};

nodarb a[200010];
int n,m,v[100010],i,x,y,maxx,c;


void act (int z)
{
    if(a[z].s != a[z].d)
    {
        int mij;
        mij=(a[z].s+a[z].d)/2;
        if(x<=mij) act(z*2);
        else act(z*2+1);

        a[z].mm=max(a[2*z].mm,a[2*z+1].mm);
    }
    else
    {
        a[z].mm=y;
    }
}


void gmax(int z)
{
    if(a[z].s>=x && a[z].d<=y)
    {
        maxx=max(maxx,a[z].mm);
    }
    else
    {
        int mij;
        mij=(a[z].d+a[z].s)/2;
        if(x<=mij) gmax(z*2);
        if(y>mij) gmax(z*2+1);
    }
}


void constr(int nod, int st, int dr)
{
    a[nod].s=st;
    a[nod].d=dr;
    if(st!=dr)
    {
        int mij;
        mij=(st+dr)/2;
        constr(nod*2,st,mij);
        constr(nod*2+1,mij+1,dr);
        a[nod].mm=max(a[2*nod+1].mm,a[2*nod].mm);
    }
    else
    {
        a[nod].mm=v[st];
    }
}

int main()
{
    fi>>n>>m;
    for(i=1;i<=n;i++)
    {
        fi>>v[i];
    }
    constr(1,1,n);

    for(i=1;i<=m;i++)
    {
        fi>>c>>x>>y;
        if(c==0)
        {
            maxx=0;
            gmax(1);
            fo<<maxx<<'\n';
        }
        else
        {
            act(1);
        }
    }
    return 0;
}