Cod sursa(job #2868917)

Utilizator PescaPescariu Matei Alexandru Pesca Data 11 martie 2022 11:37:43
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int const N=100000;
int aint[N*4],v[N];
int n,q,sz;
int constr(int node)
{
    if(aint[node]!=-1)
        return aint[node];
    return aint[node]=max(constr(node*2),constr(node*2+1));
}
int maxx(int x,int y,int px,int py,int node)
{
    if(px>=x && py<=y)
        return aint[node];
    if(py<x || px>y)
        return 0;
    int m=(px+py)/2;
    return max(maxx(x,y,px,m,node*2),maxx(x,y,m+1,py,node*2+1));
}
void upd(int node)
{
    if(node==0)
        return;
    aint[node]=max(aint[node*2],aint[node*2+1]);
    upd(node/2);
}
int main()
{
    fin>>n>>q;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    for(sz=1;sz<n;sz*=2);
    for(int i=1;i<=sz*2;i++)
        aint[i]=-1;
    for(int i=sz;i<=sz+n;i++)
        aint[i]=v[i-sz+1];
    for(int i=sz+n+1;i<=sz*2;i++)
        aint[i]=0;
    constr(1);
    for(int i=1;i<=q;i++)
    {
        int k,x,y;
        fin>>k>>x>>y;
        if(k==0)
            fout<<maxx(x,y,1,sz,1)<<"\n";
        else
            aint[sz+x-1]=y,upd((sz+x-1)/2);
    }
}