Pagini recente » Cod sursa (job #1032158) | Cod sursa (job #2138300) | Cod sursa (job #2033424) | Cod sursa (job #365614) | Cod sursa (job #2076493)
#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;
}