Cod sursa(job #2785591)

Utilizator roberttrutaTruta Robert roberttruta Data 18 octombrie 2021 22:48:03
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#define inf 99999999
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int* const_vct_minim(int n,int radical,int* v)
{
    int i,j,Min;
    int* vct_min=(int*)malloc(sizeof(int)*radical);
    for(i=0;i*radical<n;i++)
    {
        Min=-1;
        for(j=i*radical;j<(i+1)*radical&&j<n;j++)
            if(v[j]>Min)
                Min=v[j];
        vct_min[i]=Min;
    }
    return vct_min;
}

int modifica(int n,int radical,int* v,int* vct_min,int poz,int val)
{
    int i,Min=-1;
    int index=poz/radical;
    v[poz]=val;
    for(i=index*radical;i<(index+1)*radical&&i<n;i++)
        if(v[i]>Min)
            Min=v[i];
    vct_min[index]=Min;
}

int raspunde(int radical,int* v,int* vct_min,int stanga, int dreapta)
{
    int i,Min=-1;
    int poz_stanga=stanga/radical+1;
    int poz_dreapta=dreapta/radical;
    for(i=stanga;i<poz_stanga*radical&&i<=dreapta;i++)
        if(v[i]>Min)
            Min=v[i];
    for(i=dreapta;i>=poz_dreapta*radical&&i>=stanga;i--)
        if(v[i]>Min)
            Min=v[i];
    for(i=poz_stanga;i<poz_dreapta;i++)
        if(vct_min[i]>Min)
            Min=vct_min[i];
    return Min;
}

int main()
{
    int i,nr_operatii,n,radical=0,t,a,b;

    f>>n>>nr_operatii;
    int* v=(int*)malloc(sizeof(int)*n);

    for(i=0;i<n;i++)
        f>>v[i];
    while(radical*radical<n)
        radical++;

    int* vct_min=const_vct_minim(n,radical,v);

    for(i=0;i<nr_operatii;i++)
    {
        f>>t>>a>>b;
        if(t)
            modifica(n,radical,v,vct_min,a-1,b);
        else
            g<<raspunde(radical,v,vct_min,a-1,b-1)<<'\n';
    }

    free(v);
    free(vct_min);

    return 0;
}