Cod sursa(job #2703352)

Utilizator cezarinfoTulceanu Cezar cezarinfo Data 8 februarie 2021 12:24:23
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include<cstdio>
#include<algorithm>
using namespace std;
FILE*in=fopen("arbint.in","r");
FILE*out=fopen("arbint.out","w");
int n,i,m,v[400003],p,po=1,a,b,x,y;
void up(int poz,int va,int nod,int nodst,int noddr)
{
    int mij=(nodst+noddr)/2;
    if(nodst==noddr)
    {
        v[nod]=va;
        return;
    }
    else
    {
        if(poz<=mij)
        {
            up(poz,va,nod*2,nodst,mij);
        }
        else
        {
            up(poz,va,nod*2+1,mij+1,noddr);
        }
    }
    v[nod]=max(v[nod*2],v[nod*2+1]);
}
int qer(int st,int dr,int nod,int nodst,int noddr)
{
    int mij=(nodst+noddr)/2;
    if(st>dr)
    {
        return 0;
    }
    if(st==nodst&&dr==noddr)
    {
        return v[nod];
        fprintf(out,"%d %d",st,dr);
    }
    return max(qer(st,min(mij,dr),nod*2,nodst,mij),qer(max(mij+1,st),dr,nod*2+1,mij+1,noddr));
}
int main()
{
    fscanf(in,"%d%d",&n,&m);
    while(po<n)
    {
        po*=2;
        p++;
    }
    for(i=1;i<=n;i++)
    {
        fscanf(in,"%d",&a);
        up(i,a,1,1,po);
    }
    for(i=1;i<=m;i++)
    {
        fscanf(in,"%d%d%d",&b,&x,&y);
        if(b==0)
        {
            fprintf(out,"%d\n",qer(x,y,1,1,po));
        }
        else
        {
            up(x,y,1,1,po);
        }
    }
}