Cod sursa(job #2076508)

Utilizator Andrei243Nitu Mandel Andrei Andrei243 Data 26 noiembrie 2017 18:08:06
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <iostream>
#include <fstream>
#include <math.h>
#include <stdlib.h>

int*x;
int*batog;
int impartire;
int n;
using namespace std;

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


void calculare_max_batog_interior(int y)
{
    batog[y]=x[y*impartire];
    for(int i=y*impartire; i<(y+1)*impartire; i++)if(x[i]>batog[y])batog[y]=x[i];

}

void calculare_max_batog_exterior()
{
    batog[impartire]=x[impartire*impartire];
    for(int i=impartire*impartire; i<n; i++)if(x[i]>batog[impartire])batog[impartire]=x[i];


}

void schimbare(int a,int b)
{
    int aux=x[a];
    x[a]=b;
    if(b>batog[a/impartire])batog[a/impartire]=b;
    else if(batog[a/impartire]==aux&&a/impartire<impartire)calculare_max_batog_interior(a/impartire);
    else if(batog[a/impartire]==aux&&a/impartire==impartire);

}


void returneaza_maxim(int a, int b)
{if(a==b)out<<x[a]<<'\n';
    else
    if(a%impartire!=0){
    int maxim=x[a];
    int i;
    for( i=a; i%impartire!=0; i++)if(x[i]>maxim)maxim=x[i];
    i/=impartire;
    for(; i*impartire<b; i++)if(batog[i]>maxim)maxim=x[i];
    i*=impartire;
    for(; i<=b; i++)if(x[i]>maxim)maxim=x[i];

    out<<maxim<<'\n';}
    else if(a%impartire==0){
        int maxim;
    maxim=x[a];
    int i;
    if(b-a>impartire)
    for(i=a/impartire;i<b/impartire;i++)if(batog[i]>maxim)maxim=batog[i];
    for(i*=impartire;i<=b;i++)if(x[i]>maxim)maxim=x[i];
    out<<maxim<<'\n';

    }


}


void generare_batog()
{
    for(int i=0; i<impartire; i++)calculare_max_batog_interior(i);
    if(n>impartire*impartire)calculare_max_batog_exterior();
}

int main()
{
    int op,arg1,arg2,nrop;
    in>>n>>nrop;
    x=(int*)malloc(n*4);

    impartire=(int)sqrt(n);
    batog=(int*)malloc((impartire+1)*4);

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


    generare_batog();

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

        if(op==0)
        {

            arg2--;
            arg1--;
            returneaza_maxim(arg1,arg2);
        }
        else if(op==1)
        {
            arg1--;
            schimbare(arg1,arg2);


        }


    }
    free(x);
    free(batog);
    return 0;
}