Cod sursa(job #2209664)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 4 iunie 2018 00:47:59
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>

using namespace std;
FILE *f,*g;
int n,m,x,a,b;
int arb[4*100001+100];
int POZ,MAX=0;
int MAXIMUL(int a,int b)
{
    if(a>b)
        return a;
    return b;
}
void Update(int nod,int s,int d)
{
    int M;
    if(s==d)
    {
        arb[nod]=x;
        return;
    }
    else
    {
        M=(s+d)/2;
        if(POZ<=M)
            Update(nod*2,s,M);
        else
            Update(nod*2+1,M+1,d);
        arb[nod]=MAXIMUL(arb[2*nod],arb[2*nod+1]);
    }
}
void Search(int nod,int s,int d)
{
    int M;
    if(a<=s && d<=b)
    {
        if(MAX<arb[nod])
            MAX=arb[nod];
        return;
    }
    M=(s+d)/2;
    if(a<=M)
        Search(2*nod,s,M);
    if(M<b)
        Search(2*nod+1,M+1,d);
}
void Solve()
{
    int i,logic;
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d %d %d",&logic,&a,&b);
        if(logic)
        {
            POZ=a;x=b;
            Update(1,1,n);
        }
        else
        {
            MAX=0;
            Search(1,1,n);
            fprintf(g,"%d\n",MAX);
        }
    }
}
void Read()
{
    fscanf(f,"%d %d",&n,&m);
    int i;
    for(i=1;i<=n;i++)
    {
        fscanf(f,"%d",&x);
        POZ=i;
        Update(1,1,n);
    }
}
int main()
{
    f=fopen("arbint.in","r");g=fopen("arbint.out","w");
    Read();
    Solve();
    fclose(f),fclose(g);
    return 0;
}