Cod sursa(job #2216899)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 28 iunie 2018 12:38:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <algorithm>
#include <cstdio>
#define mij(A,B) (A+B)/2
using namespace std;
FILE *f=fopen("arbint.in","r");
FILE *g=fopen("arbint.out","w");
int start,finish,val,AINT[10000000],i,N,M,poz;
bool c;
void u(int nod,int st,int dr,int pos,int val){
    if(st > pos || dr < pos){
        return ;
    }

    if(st == dr){
        AINT[nod] = val;
        return ;
    }

    int mid = (st + dr) / 2;
    u(nod * 2,st,mid,pos,val);
    u(nod * 2 + 1,mid + 1,dr,pos,val);
    AINT[nod] = max(AINT[2 * nod],AINT[2 * nod + 1]);
}

int q(int nod,int st,int dr,int S,int D){
    if(dr < S || st > D){
        return 0;
    }

    if(S <= st && dr <= D){
        return AINT[nod];
    }
    int mid = (st + dr) / 2;
    return max(q(nod * 2,st,mid,S,D),q(nod * 2 + 1,mid + 1,dr,S,D));
}

int main()
{
    fscanf(f,"%d %d",&N,&M);
    for(i=1;i<=N;i++)
    {
        fscanf(f,"%d",&val);
        poz=i;
        u(1,1,N,poz,val);
    }
    for(i=1;i<=M;i++)
    {
        fscanf(f,"%d",&c);
        if(!c)
        {
            fscanf(f,"%d %d",&start,&finish);
            fprintf(g,"%d\n",q(1,1,N,start,finish));
        }
        else
        {
            fscanf(f,"%d %d",&poz,&val);
            u(1,1,N,poz,val);
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}