Cod sursa(job #1789479)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 27 octombrie 2016 00:56:06
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.59 kb
#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, capat;
        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 + 2;i < poz2 + 1; ++i)
            if(max[i] > maxim)
            maxim = max[i];

        capat = (poz1 + 1) * n_max ;
        while(capat > b)
            --capat;

        for(i = a;i <= capat; ++i)
            if(sir[i] > maxim)
            maxim = sir[i];

        capat = poz2 * n_max +1;
        while(capat < a)
            ++capat;

        for(i = capat;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);
            }

    }




}