Cod sursa(job #2077360)

Utilizator Andrei243Nitu Mandel Andrei Andrei243 Data 27 noiembrie 2017 22:27:46
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb

#include <iostream>
#include <fstream>
#include <cmath>
#include <stdlib.h>
using namespace std;
int x[100001];
int batog[5000];
int impartire,nr_impartiri;
int n;


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


void calculare_max_batog(int y)
{
    int lim_sup;
    int lim_inf=(y-1)*impartire+1;
    batog[y]=x[lim_inf];
    if(n<y*impartire)lim_sup=n;
    else lim_sup=y*impartire;

    batog[y]=x[y*impartire];
    for(int i=lim_inf+1; i<=lim_sup; ++i)if(x[i]>batog[y])batog[y]=x[i];

}



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

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



    while(a<=b)
    {
        if(batog[(a-1)/impartire+1]>maxim)maxim=batog[(a-1)/impartire+1];
        a+=impartire;
    }
    // cout<<maxim<<'\n';
    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=(int)sqrt(n);
    if(impartire>n)impartire=n;
    if(impartire<1)impartire=1;
    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)
        {


            returneaza_maxim(arg1,arg2);
        }
        else
        {
            x[arg1]=arg2;
            calculare_max_batog((arg1-1)/impartire+1);



        }


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