Cod sursa(job #2572460)

Utilizator Moldovan_Andrei112002Moldovan Andrei Moldovan_Andrei112002 Data 5 martie 2020 12:53:37
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
using namespace std;
ifstream fin("arbint.in");ofstream fout("arbint.out");
pair<int,pair<int,int> >arb[500005];
int n,m,a,b,v[100010],maxx,cer;
void read()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
}
void build(int nod,int st,int dr)
{
    arb[nod].first=st;
    arb[nod].second.first=dr;
    if(st!=dr)
    {
        int mij=(st+dr)/2;
        build(2*nod,st,mij);
        build(2*nod+1,mij+1,dr);
        arb[nod].second.second=max(arb[2*nod].second.second,arb[2*nod+1].second.second);
    }else
    {
        arb[nod].second.second=v[st];
    }
}
void get_max(int nod)
{
    if(a<=arb[nod].first && arb[nod].second.first<=b)
    {
        int var=arb[nod].second.second;
        maxx=max(var,maxx);
    }else
    {
        int mij=(arb[nod].first+arb[nod].second.first)/2;
        if(a<=mij)
        {
            get_max(2*nod);
        }
        if(b>mij)
        {
            get_max(2*nod+1);
        }
    }
}
void upgrade(int nod)
{
    if(a==arb[nod].first && a==arb[nod].second.first)
    {
        arb[nod].second.second=b;
    }else
    {
        int mij=(arb[nod].first+arb[nod].second.first)/2;
        if(a<=mij)
            upgrade(2*nod);
        else
            upgrade(2*nod+1);
        arb[nod].second.second=max(arb[2*nod].second.second,arb[2*nod+1].second.second);
    }
}
int main()
{
    read();
    build(1,1,n);
    while(m)
    {
        fin>>cer>>a>>b;
        maxx=0;
        if(cer==0)
            get_max(1);
        else
            upgrade(1);
        m-=1;
    }
    fin.close();fout.close();
    return 0;
}