Cod sursa(job #3339811)

Utilizator Coman_DianaComan Diana Coman_Diana Data 10 februarie 2026 11:38:38
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <stdio.h>
#include <stdlib.h>

#define NMAX 100000
#define BATOG_SIZE 320

int vec[NMAX + 1];
int maxi_batog[BATOG_SIZE];

int num_elem;
FILE *fout;

int max( int a, int b ) {
  return (a > b) ? a : b;
}

void Maxim( int stanga, int dreapta ) {
  int maxi, batog_st, batog_dr, ind;
  maxi = 0;

  batog_st = stanga / BATOG_SIZE;
  batog_dr = dreapta / BATOG_SIZE;

  for ( ind = batog_st + 1; ind < batog_dr; ind++ )
    maxi = max( maxi, maxi_batog[ind] );
  for ( ind = stanga; ind < ( batog_st + 1 ) * BATOG_SIZE && ind <= dreapta; ind++ )
    maxi = max( maxi, vec[ind] );
  for ( ind = batog_dr * BATOG_SIZE; ind <= dreapta; ind++ )
    if ( ind >= stanga )
      maxi = max( maxi, vec[ind] );

  fprintf( fout, "%d\n", maxi );
}

void Schimb( int poz, int val_noua ) {
  int batog, ind;
  vec[poz] = val_noua;
  batog = poz / BATOG_SIZE;

  maxi_batog[batog] = 0;
  for ( ind = batog * BATOG_SIZE; ind < (batog + 1) * BATOG_SIZE && ind < num_elem; ind++ )
    maxi_batog[batog] = max( maxi_batog[batog], vec[ind] );
}


int main()
{
    FILE *fin;
    int num_op, ind, tip, op, dreapta, stanga, batog;

    fin = fopen( "arbint.in", "r" );
    fscanf( fin, "%d%d", &num_elem, &num_op );

    for ( ind = 0; ind < num_elem; ind++ ) {
      fscanf( fin, "%d", &vec[ind] );
      batog = ind / BATOG_SIZE;
      maxi_batog[batog] = max( maxi_batog[batog], vec[ind] );
    }

    fout = fopen( "arbint.out", "w" );
    for ( op = 0; op < num_op; op++ ) {
      fscanf( fin, "%d%d%d", &tip, &stanga, &dreapta );
      stanga--;
      dreapta--;

      if ( tip == 0 )
        Maxim( stanga, dreapta );
      else
        Schimb( stanga, dreapta + 1 );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}