Pagini recente » Cod sursa (job #1059099) | Cod sursa (job #3358498) | Cod sursa (job #1477308) | Cod sursa (job #3358483) | Cod sursa (job #1789434)
#include <stdio.h>
#include <math.h>
int sir[100000],max[1000],n;
void creare_max() //creare vectorul de maximuri pe grupe
{
int radical, n_max, i, j, mult;
radical = sqrt(n);
n_max = n / radical;
mult = -1;
for(i = 1;i <= radical; ++i)
{
++mult;
max[mult+1] = 0;
for(j = 1;j <= n_max; ++j)
if(max[mult + 1] < sir[mult * n_max + j])
max[mult + 1] = sir[mult * n_max + j];
}
++mult;
if( n % radical != 0)
++radical;
max[mult+1]=0;
for(i = 1;i <= n%radical; ++i)
if(max[mult + 1] < sir[mult * n_max + i])
max[mult + 1] = sir[mult * n_max + i];
}
void schimba_max(int a,int b) //schimba valoare lui sir[a]
{
int radical, n_max, poz1, i, mult;
radical = sqrt(n);
n_max = n / radical;
mult = a / n_max;
sir[a] = b;
if(a % n_max == 0)
--mult;
max[mult+1] = 0;
for(i = 1;((i <= n_max) && ((mult * n_max + i) <= n)); ++i)
if(max[mult+1] < sir[mult * n_max + i])
max[mult+1] = sir[mult * n_max + i];
}
int scrie_max(int a, int b)
{
int radical, n_max, poz1, poz2, i, j, maxim;
radical = sqrt(n);
n_max = n / radical;
poz1 = a / n_max;
if(a % n_max == 0)
--poz1;
poz2 = b / n_max;
maxim = 0;
for(i = poz1 + 1;i < poz2; ++i)
if(max[i] > maxim)
maxim = max[i];
for(i = a;(i <= ((poz1 + 1) * n_max )); ++i)
if(sir[i] > maxim)
maxim = sir[i];
for(i = (poz2 * n_max +1);i <= b; ++i)
if(sir[i] > maxim)
maxim = sir[i];
return maxim;
}
int main()
{
int m, i, x, a, b, rez;
FILE *f;
FILE *g;
g=fopen("arbint.out","w+");
f=fopen("arbint.in","r");
fscanf(f,"%d %d",&n,&m);
for(i = 1;i <= n; ++i)
fscanf(f,"%d",&sir[i]);
creare_max();
for(i = 1;i <= m; ++i)
{
fscanf(f,"%d %d %d",&x,&a,&b);
if(x == 1)
schimba_max(a,b);
else
{
rez = scrie_max(a,b);
fprintf(g,"%d\n",rez);
}
}
}