Cod sursa(job #2816606)

Utilizator albertaizicAizic Albert albertaizic Data 11 decembrie 2021 19:02:09
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>
#define MAX 100000

int v[MAX];
int aint[4 * MAX];
int lLim, rLim;

void build(int l, int r, int loc){
  int lSon, rSon, mid;

  if(l==r){
    aint[loc]=v[l];
    return;
  }

  mid=(l+r)/2;
  lSon=loc+1;
  rSon=loc+2*(mid-l+1);

  build(l, mid, lSon);
  build(mid + 1, r, rSon);

  if(aint[rSon]>aint[lSon])
    aint[loc]=aint[rSon];
  else
    aint[loc]=aint[lSon];
}

int calcm(int l, int r, int loc) {
  int lMax, rMax, lSon, rSon, mid;

  if( lLim<=l && r<=rLim){
    return aint[loc];
  }

  mid=(l+r)/2;
  lSon=loc+1;
  rSon=loc+2*(mid-l+1);

  lMax=rMax=0;

  if(lLim<=mid){
    lMax=calcm(l,mid,lSon);
  }
  if(rLim>mid){
    rMax=calcm(mid+1,r,rSon);
  }

  if(lMax>rMax)
    return lMax;
  return rMax;
}

void update(int pos, int val, int loc, int l, int r){
  int lSon, rSon, mid;

  if(l==r){
    aint[loc]=val;
    return;
  }

  mid=(l+r)/2;
  lSon=loc+1;
  rSon=loc+2*(mid-l+1);

  if(mid>=pos)
    update(pos,val,lSon,l,mid);
  else
    update(pos,val,rSon,mid+1,r);

  if(aint[rSon]>aint[lSon])
    aint[loc]=aint[rSon];
  else
    aint[loc]=aint[lSon];
}

int main() {
    FILE *fin,*fout;
    fin=fopen("arbint.in","r");
    fout=fopen("arbint.out","w");
    int n, m, q, a, b, i;

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

    for(i=0;i<n;i++)
      fscanf(fin,"%d",&v[i]);

    build(0,n-1,0);

    while(m--){
      fscanf(fin,"%d%d%d",&q,&a,&b);
      a--;

      if(q==0){
        b--;
        lLim=a;
        rLim=b;
        fprintf(fout,"%d\n",calcm(0,n-1,0));
      }else{
        v[a]=b;
        update(a,b,0,0,n-1);
      }
    }

    fclose(fin);
    fclose(fout);

    return 0;
}