Cod sursa(job #2076493)

Utilizator Andrei243Nitu Mandel Andrei Andrei243 Data 26 noiembrie 2017 17:50:22
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 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){
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';

}


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);


}


}

    return 0;
}