Cod sursa(job #2783296)

Utilizator teochess2017Togan Teodor-Bogdan teochess2017 Data 14 octombrie 2021 10:30:39
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 131072

int v[MAXN], arb[MAXN * 2];

void update(int i, int val, int n){
  v[i] = val;
  i = i + n - 1;
  arb[i] = val;
  i /= 2;
  while(1 <= i){
    if(arb[i * 2] < arb[i * 2 + 1]){
      arb[i] = arb[i * 2 + 1];
    }else{
      arb[i] = arb[i * 2];
    }
    i /= 2;
  }
}
int query(int a, int b, int st, int dr, int i, int niv){
  int aux[2];
  if((a <= st) && (dr <= b)){
    return arb[i];
  }else{
    if((st <= b) && (a <= dr)){
      aux[0] = query(a, b, st, dr - niv, i * 2, niv / 2);
      aux[1] = query(a, b, st + niv, dr, i * 2 + 1, niv / 2);
      if(aux[0] < aux[1]){
        return aux[1];
      }else{
        return aux[0];
      }
    }else{
      return 0;
    }
  }
}

int main()
{
    FILE *fin, *fout;
    int n, i, a, b, q, p, op;
    fin = fopen("arbint.in", "r");
    fscanf(fin, "%d%d", &n, &q);
    for(i = 0; i < n; i++){
      fscanf(fin, "%d", &v[i]);
    }
    p = 1;
    while(p < n){
      p *= 2;
    }
    n = p;
    for(i = 2 * n - 1; n <= i; i--){
      arb[i] = v[i - n];
    }
    for(i = n - 1; 0 < i; i--){
      if(arb[i * 2] < arb[i * 2 + 1]){
        arb[i] = arb[i * 2 + 1];
      }else{
        arb[i] = arb[i * 2];
      }
    }
    fout = fopen("arbint.out", "w");
    for(i = 0 ; i < q; i++){
      fscanf(fin, "%d%d%d", &op, &a, &b);
      if(op == 0){
        fprintf(fout, "%d\n", query(a, b, 1, n, 1, n / 2));
      }else{
        update(a, b, n);
      }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}