Cod sursa(job #2901100)

Utilizator mirceaspPetcu Mircea mirceasp Data 12 mai 2022 22:29:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
long long n,m,op,v[100001];
struct nod{
    long long lower,upper,mx,nr;
};
nod arb[4*100001];
void create_nod(long long st,long long dr,long long nr)
{
    if(st == dr) {
        if(nr == 0 || nr != arb[nr].nr)
        arb[nr].mx = v[dr];
        arb[nr].lower = st;
        arb[nr].upper = st;
        arb[nr].nr = nr;
        return;
    }
    else
    {
        long long mij = (st+dr)/2;
        create_nod(st,mij,2*nr+1);
        create_nod(mij+1,dr,2*nr+2);
        arb[nr].mx = max(arb[2*nr+1].mx,arb[2*nr+2].mx);
        arb[nr].lower = arb[2*nr+1].lower;
        arb[nr].upper = arb[2*nr+2].upper;
        arb[nr].nr = nr;
        }

}
long long maxim(long long i,long long j,long long nr)
{
    if(j<arb[nr].lower || i> arb[nr].upper)
        return 0;
    if(i<= arb[nr].lower && j>= arb[nr].upper)
        return arb[nr].mx;
    return max(maxim(i,j,nr*2+1), maxim(i,j,nr*2+2));

}
void update(long long a,long long b,long long nr) {

    if(a<arb[nr].lower || a>arb[nr].upper)
        return;
    else if(arb[nr].lower == arb[nr].upper)
    {arb[nr].mx = b;return;}
    update(a,b,nr*2+1);
    update(a,b,nr*2+2);
    arb[nr].mx = max(arb[2*nr+1].mx,arb[2*nr+2].mx);
}
int main()
{
    f>>n>>m;
    long long i;
    long long nr = 0;
    for(i = 0;i<n;i++)
    {
        f>>v[i];

    }
    long long a,b;
    create_nod(0,n-1,0);
    for(i = 0;i<m;i++)
    {
        f>>op>>a>>b;
        switch (op) {
            case 0: {
                g<<maxim(a-1, b-1,0)<<'\n';
                break;
            }
            case 1: {
                update(a-1, b,0);
                break;
            }
        }
    }
    f.close();g.close();
}