Pagini recente » Cod sursa (job #1375614) | Cod sursa (job #2355680) | Cod sursa (job #1102671) | Cod sursa (job #408673) | Cod sursa (job #2076508)
#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;
}