Cod sursa(job #3004494)

Utilizator cezarinfoTulceanu Cezar cezarinfo Data 16 martie 2023 12:57:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include<cstdio>
#include<algorithm>
using namespace std;
FILE*in=fopen("arbint.in","r");
FILE*out=fopen("arbint.out","w");
const int NMAX=100007;
int n,m,i,v[4*NMAX],po=1,c,a,b,x;
void update(int poz,int val,int nod,int nodst,int noddr)
{
    if(nodst==noddr)
    {
        v[nod]=val;
        return;
    }
    int mij=(nodst+noddr)/2;
    if(poz<=mij)
    {
        update(poz,val,2*nod,nodst,mij);
    }
    else
    {
        update(poz,val,2*nod+1,mij+1,noddr);
    }
    v[nod]=max(v[2*nod],v[2*nod+1]);
}
int qer(int st,int dr,int nod,int nodst,int noddr)
{
    if(st==nodst&&dr==noddr)
    {
        return v[nod];
    }
    int mij=(nodst+noddr)/2;
    if(mij>=dr)
    {
        return qer(st,dr,2*nod,nodst,mij);
    }
    else if(st>=mij+1)
    {
        return qer(st,dr,2*nod+1,mij+1,noddr);
    }
    else
    {
        return max(qer(st,mij,2*nod,nodst,mij),qer(mij+1,dr,2*nod+1,mij+1,noddr));
    }
}
int main()
{
    fscanf(in,"%d%d",&n,&m);
    while(po<n)
    {
        po*=2;
    }
    for(i=1;i<=n;i++)
    {
        fscanf(in,"%d",&x);
        update(i,x,1,1,po);
    }
    for(i=1;i<=m;i++)
    {
        fscanf(in,"%d%d%d",&c,&a,&b);
        if(c==1)
        {
            update(a,b,1,1,po);
        }
        else
        {
            fprintf(out,"%d\n",qer(a,b,1,1,po));
        }
    }
}