Cod sursa(job #3180280)

Utilizator razviOKPopan Razvan Calin razviOK Data 4 decembrie 2023 22:14:42
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.36 kb
#include <stdio.h>
#include <stdlib.h>

unsigned int Maximum(unsigned int a,unsigned int b){
    return (a<b) ? b:a;
}
void BuildSegTree(unsigned int *segarr,unsigned int *arr,unsigned int low,unsigned int high,unsigned int currnode){

    if(low==high) {
        segarr[currnode] = arr[low];
        return;
    }

    if(low<high){
        int mid=low+(high-low)/2;
        BuildSegTree(segarr,arr,low,mid,(currnode<<1)+1);
        BuildSegTree(segarr,arr,mid+1,high,(currnode<<1)+2);
        segarr[currnode]= Maximum(segarr[(currnode<<1)+1],segarr[(currnode<<1)+2]);
    }
}
unsigned int Query(unsigned int *segarr,unsigned int low,unsigned int high,int a,int b,unsigned int currnode){

      if(a<=low && high<=b)
          return segarr[currnode];

      if(low<high){
          int mid=low+(high-low)/2;
          if(a<=mid && mid<b)
              return Maximum(Query(segarr,low,mid,a,b,(currnode<<1)+1), Query(segarr,mid+1,high,a,b,(currnode<<1)+2));
          if(a<=mid)
              return Query(segarr,low,mid,a,b,(currnode<<1)+1);

          if(mid<b)
              return Query(segarr,mid+1,high,a,b,(currnode<<1)+2);
      }
}
void Update(unsigned int *segarr,unsigned int *arr,unsigned int low,unsigned int high,int a,int b,unsigned int currnode){

    if(low==high){
        arr[a]=b;
        segarr[currnode]=b;
        return;
    }

    if(low<high){
        int mid=low+(high-low)/2;
        if(a<=mid) Update(segarr,arr,low,mid,a,b,(currnode<<1)+1);
        else if(mid<a) Update(segarr,arr,mid+1,high,a,b,(currnode<<1)+2);
        segarr[currnode]=Maximum(segarr[(currnode<<1)+1],segarr[(currnode<<1)+2]);
    }
}
int main() {
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    unsigned int M,N,op,a,b;
    scanf("%u",&N);
    scanf("%u",&M);
    unsigned int *segarr=(unsigned int*) malloc(sizeof(unsigned int)*((N<<1)-1));
    unsigned int*arr=(unsigned int*) malloc(sizeof(unsigned int)*N);

    for(unsigned int i=0;i<N;i++)
        scanf("%u",&arr[i]);

    BuildSegTree(segarr,arr,0,N-1,0);
    for(unsigned int i=0;i<M;i++){
        scanf("%u",&op);
        scanf("%u",&a);
        scanf("%u",&b);
        if(op==0)
            printf("%u\n", Query(segarr,0,N-1,a-1,b-1,0));
        else Update(segarr,arr,0,N-1,a-1,b,0);
    }
//
//    for(unsigned int i=0;i<(N<<1)-1;i++)
//        printf("%u ",segarr[i]);

    free(segarr);
    free(arr);
    return 0;
}