Cod sursa(job #2572604)

Utilizator Lazar_VladLazar Vlad Lazar_Vlad Data 5 martie 2020 13:31:59
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#define f first
#define s second
using namespace std;
ifstream fi ("arbint.in");
ofstream fo ("arbint.out");
pair<pair<int,int>,int>w[500010];
int n,m,v[500010],a,b,maxx,cer;

void creare(int nod, int st, int dr)
{
    w[nod].f.f=st;
    w[nod].f.s=dr;
    if(st==dr)
    {
        w[nod].s=v[st];
    }
    else
    {
        int mij=(st+dr)/2;
        creare(2*nod,st,mij);
        creare(2*nod+1,mij+1,dr);
        w[nod].s=max(w[2*nod].s,w[2*nod+1].s);
    }
}

void maxim(int nod)
{
    if(a<=w[nod].f.f && w[nod].f.s<=b)
    {
        maxx=max(maxx,w[nod].s);
    }
    else
    {
        int mij=(w[nod].f.f+w[nod].f.s)/2;
        if(a<=mij) maxim(nod*2);
        if(b>mij) maxim(nod*2+1);
    }
}

void actualizare(int nod)
{
    if(a==w[nod].f.f && a==w[nod].f.s)
        w[nod].s=b;
    else
    {
        int mij=(w[nod].f.f+w[nod].f.s)/2;
        if(a<=mij) actualizare(nod*2);
        else actualizare(nod*2+1);

        w[nod].s=max(w[nod*2].s,w[nod*2+1].s);
    }
}

int main()
{
    fi>>n>>m;
    for(int i=1;i<=n;i++)
        fi>>v[i];
    creare(1,1,n);
    for(int i=1;i<=m;i++)
    {
        fi>>cer>>a>>b;
        if(cer==0)
        {
            maxx=0;
            maxim(1);
            fo<<maxx<<'\n';
        }
        else
        {
            actualizare(1);
        }
    }
    fi.close();
    fo.close();
    return 0;
}