Cod sursa(job #2572505)

Utilizator ovidiu_boambaOvidiu Boamba ovidiu_boamba Data 5 martie 2020 13:07:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
#include <cstdlib>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

#define f first
#define s second
int N,M,v[100005],maxx,a,b;
pair <int,pair<int,int> > c[500010];

void cer0(int poz)
{
    int st,dr,mij;
    st=c[poz].s.f;
    dr=c[poz].s.s;
    mij=(st+dr)/2;
    if(a<=st && b>=dr) maxx=max(maxx,c[poz].f); ///daca este cuprins [a,b] intre st si dr
    else
    {
        if(a<=mij) cer0(poz*2);///ramura din stanga
        if(b>mij) cer0(poz*2+1);///ramura din dreapta
    }
}

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

void afisare()
{
    int i;
    for(i=1; i<=9; i++) fout<<c[i].f<<" "<<c[i].s.f<<" "<<c[i].s.s<<'\n';
}

void cer1(int poz)
{
    int st,dr,mij;
    st=c[poz].s.f;
    dr=c[poz].s.s;
    if(a==st && a==dr) c[poz].f=b;
    else
    {
        mij=(st+dr)/2;
        if(a<=mij) cer1(poz*2);
        else cer1(poz*2+1);
        c[poz].f=max(c[2*poz].f,c[2*poz+1].f);
    }
}

int main()
{
    int i,opt;
    fin>>N>>M;
    for(i=1; i<=N; i++) fin>>v[i];
    build(1,N,1);
    for(i=1; i<=M; i++)
    {
        fin>>opt>>a>>b;
        if(opt==0)
        {
            maxx=0;
            cer0(1);
            fout<<maxx<<'\n';
        }
        else cer1(1);
    }
    ///afisare();
    fin.close();
    fout.close();
    return 0;
}