Cod sursa(job #3136519)

Utilizator ClaudiuppPopa-Panda Claudiu-Ionut Claudiupp Data 6 iunie 2023 18:49:48
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <stdio.h>
#include <stdlib.h>

#define N_MAX 100001

int tree[4 * N_MAX + 5];


int max(int a, int b)
{
  if(a >= b)
    {
      return a;
    }
  else
    {
      return b;
    }
}


void update(int node, int le, int ri, int pos, int val) // node 1 left 1 right n
{
  if(le == ri)
    {
      tree[node] = val;
      return;
    }
    
  int mid = (le + ri) / 2;

  if(pos <= mid)
    {
      update(2 * node, le, mid, pos, val);
    }
  else
    {
      update(2 * node + 1, mid + 1, ri, pos, val);
    }

  tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}

void query(int node, int le, int ri, int x, int y, int *ans)
{
  if(x <= le && ri <= y)
    {
      *ans = max(*ans, tree[node]);
      return;
    }

  int mid = (le + ri) / 2;

  if(x <= mid)
    {
      query(2 * node, le, mid, x, y, ans);
    }
  
  if(y > mid)
    {
      query(2 * node + 1, mid + 1, ri, x, y, ans);
    }
}

int main ()
{
  int n = 0;

  int m = 0;

  FILE *file_in = NULL;
  FILE *file_out = NULL;

  if((file_in = fopen("arbint.in","r")) == NULL)
    {
      perror("EROARE LA DESCHIDEREA FISIERULUI DE CITIRE !");
      exit(-1);
    }

  if((file_out = fopen("arbint.out","w")) == NULL)
    {
      perror("EROARE LA DESCHIDEREA FISIERULUI DE SCRIERE !");
      exit(-1);
    }

  fscanf(file_in,"%d %d", &n, &m);

  int i = 0;

  int valoare = 0;

  for(i=1;i<=n;i++)
    {
      fscanf(file_in,"%d",&valoare);
      update(1,1,n,i,valoare);
    }

  int x = 0;
  int a = 0;
  int b = 0;

  for(i=1;i<=m;i++)
    {
      fscanf(file_in, "%d %d %d", &x, &a, &b);

      if(x == 0) // query
	{
	  int maxim = -1;

	  query(1,1,n,a,b,&maxim);

	  fprintf(file_out,"%d \n",maxim);
	  
	}
      else // update
	{
	  update(1,1,n,a,b);
	}
    }

  fclose(file_in);
  fclose(file_out);


  return 0;
}