Cod sursa(job #1573646)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 19 ianuarie 2016 20:33:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 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,V[10000000],i,N,M,poz;
bool c;
void update(int nod,int st,int dr)
{
    if(st==dr)
        V[nod]=val;
    else
    {
        if(st<=poz&&poz<=(st+dr)/2)
            update(nod*2,st,(st+dr)/2);
        else
            update(nod*2+1,(st+dr)/2+1,dr);
        V[nod]=max(V[nod*2],V[nod*2+1]);
    }
}
int answer(int nod,int st,int dr)
{
    if(start<=st&&dr<=finish)
        return V[nod];
    else
    {
        if(mij(st,dr)<finish)
            if(mij(st,dr)>=start)
                return max(answer(nod*2,st,mij(st,dr)),answer(nod*2+1,mij(st,dr)+1,dr));
            else
                return answer(nod*2+1,mij(st,dr)+1,dr);
        else
            return answer(nod*2,st,mij(st,dr));

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