Cod sursa(job #3186259)

Utilizator LucapetreMirea Bulubasa Petre Luca Lucapetre Data 22 decembrie 2023 13:09:09
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

struct nod
{
    int st,dr;
    int maxi;
    nod *left,*right;
}root;

nod build(int st,int dr,int v[])
{
    nod a;
    a.st=st;
    a.dr=dr;
    if(st==dr)
    {
        a.maxi=v[st];
        a.left=a.right=NULL;
        return a;
    }
    int mij=(st+dr)/2;
    a.left = new nod;
    a.right = new nod;
    *(a.left) = build(st,mij,v);
    *(a.right) = build(mij+1,dr,v);
    a.maxi=max(a.left->maxi,a.right->maxi);
    return a;
}

int query(int st,int dr,nod &nc)
{
    if(dr < nc.st || st > nc.dr)
        return -1;
    if(dr >= nc.dr && st <= nc.st)
        return nc.maxi;
    return max(query(st,dr,*(nc.left)),query(st,dr,*(nc.right)));
}

void update(int p,int nval,nod &nc)
{
    if(nc.dr < p || nc.st > p)
        return;
    if(nc.st == p && nc.dr == p)
    {
        nc.maxi = nval;
        return;
    }
    update(p,nval,*(nc.left));
    update(p,nval,*(nc.right));
    nc.maxi = max(nc.left->maxi,nc.right->maxi);

}

int main()
{
    int n,m,v[100005];
    int t,a,b;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    root = build(1,n,v);
    for(int i=1;i<=m;i++)
    {
        fin>>t>>a>>b;
        if(t==0)
        {
            fout<<query(a,b,root)<<'\n';
        }
        if(t==1)
        {
            update(a,b,root);
        }
    }
}