Cod sursa(job #2077788)

Utilizator Andrei243Nitu Mandel Andrei Andrei243 Data 28 noiembrie 2017 17:00:52
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb

#include <iostream>
#include <fstream>
#include <math.h>


using namespace std;
int x[100100];
int batog[400];
int impartire,n,nr_impartiri;


ifstream in("arbint.in");
ofstream out("arbint.out");

int maximum(int a,int b)
{
    if(a>=b)return a;
    return b;

}

int minim(int a, int b)
{
    if(a<=b)return a;
    return b;

}

void calculare_max_batog(int y)
{
    int lim_sup=minim(y*impartire,n);
    int lim_inf=(y-1)*impartire+1;
    batog[y]=x[lim_inf];
    for(int i=lim_inf+1; i<=lim_sup; ++i)batog[y]=maximum(batog[y],x[i]);

}


void calculare_max_int(int a,int b)
{
    int maxim=x[a];
    while(a%impartire!=1&&a<=b)
    {
        maxim=maximum(maxim,x[a++]);
    }

    while(b%impartire!=1&&a<=b)
    {
        maxim=maximum(maxim,x[b--]);
    }



    while(a<=b)
    {
        maxim=maximum(maxim,batog[(a-1)/impartire+1]);
        a+=impartire;
    }

    out<<maxim<<'\n';
}



void generare_batog()
{

    for(int i=1; i<=nr_impartiri; ++i)
    {
        calculare_max_batog(i);

    }




}

int main()
{
    int op,arg1,arg2,nrop;
    in>>n>>nrop;


    impartire=maximum(1,minim(n,(int)sqrt((float)n)));
    nr_impartiri=n/impartire;

    for(int i=1; i<=n; ++i)in>>x[i];


    generare_batog();

    for(int i=0; i<nrop; ++i)
    {
        in>>op>>arg1>>arg2;

        if(op==0)
        {
            calculare_max_int(arg1,arg2);

        }
        else
        {
            x[arg1]=arg2;
            int j=(arg1-1)/impartire;
            calculare_max_batog(j);



        }


    }

    in.close();
    out.close();
    return 0;
}