Cod sursa(job #3290411)

Utilizator Paunescu_Stefan_Vladfdsasdfdfs Paunescu_Stefan_Vlad Data 30 martie 2025 17:24:03
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100000
int v[N*4];
int n,q,i,cn,j,type,x,y;
int max(int a,int b){
  if(a>b){
    return a;
  }
  else{
    return b;
  }
}
void build(){
  for(i=cn-1;i>0;i--){
    v[i]=max(v[i*2],v[i*2+1]);
  }
}
int query(int st, int dr){
    int maxim=0;
    st+=cn;
    dr+=cn;
    while(st<=dr){
      if(st%2==1){
        maxim=max(maxim,v[st]);
      }
      if(dr%2==0){
        maxim=max(maxim,v[dr]);
      }
      st=(st+1)/2;
      dr=(dr-1)/2;
    }
    return maxim;
}
void update(int poz, int val){
  poz+=cn;
  v[poz]=val;
  poz/=2;
  while(poz>0){
      v[poz]=max(v[poz*2],v[poz*2+1]);
      poz/=2;
  }
}
int main()
{
    FILE *fin; FILE *fout;
    fin=fopen("arbint.in","r");
    fout=fopen("arbint.out","w");
    fscanf(fin,"%d%d",&n,&q);
    cn=pow(2,32-__builtin_clz(n));
    for(i=cn;i<cn+n;i++){
      fscanf(fin,"%d",&v[i]);
    }
    build();
    for(i=1;i<=q;i++){
      fscanf(fin,"%d%d%d",&type,&x,&y);
      if(type==1){
        x--;
        update(x,y);
      }
      if(type==0){
        x--;
        y--;
        fprintf(fout,"%d\n",query(x,y));
      }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}