Cod sursa(job #1783238)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 18 octombrie 2016 21:27:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <iostream>
#define maxim(a,b) a>b ? a : b
#define NMAX 500000

using namespace std;

FILE *fin=fopen("arbint.in","r");
FILE *fout=fopen("arbint.out","w");

int arbint[NMAX],i,j,n,m,a,b,maxi;

void actualizare(int nod, int st, int dr)
{
    if (st==dr)
    {
        arbint[nod]=b;
        return;
    }
    int mij=(st+dr)/2;
    if (a<=mij)
        actualizare(2*nod,st,mij);
    else
        actualizare(2*nod+1,mij+1,dr);
    arbint[nod]=maxim(arbint[2*nod],arbint[2*nod+1]);
}

void interogare(int nod, int st, int dr)
{
    if (st>=a&&dr<=b)
    {
        if (maxi<arbint[nod])
        maxi=arbint[nod];
        return;
    }
    int mij=(st+dr)/2;
    if (a<=mij)
        interogare(2*nod,st,mij);
    if (mij<b)
        interogare(2*nod+1,mij+1,dr);
}

int main()
{
    fscanf(fin,"%d%d",&n,&m);
    for (i=1; i<=n; i++)
    {
        int x;
        fscanf(fin,"%d",&x);
        a=i;
        b=x;
        actualizare(1,1,n);
    }
    for (i=1; i<=m; i++)
    {
        bool op;
        fscanf(fin,"%d%d%d",&op,&a,&b);
        if (op)
        {
            actualizare(1,1,n);
        }
        else
            {
                maxi=-1;
                interogare(1,1,n);
                fprintf(fout,"%d\n",maxi);
            }
    }
}