Cod sursa(job #2591430)

Utilizator anabatAna Batrineanu anabat Data 30 martie 2020 15:30:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <algorithm>

#define NMAX 100000

int v[NMAX+1], aint[NMAX*4+1];

void update(int nod,int st,int dr,int poz,int val){
  if(st==dr){ ///suntem la o frunza
    aint[nod]=val;
  }
  else{
    int mij=(st+dr)/2;
    if(poz<=mij){ ///fiu st
      update(2*nod,st,mij,poz,val);
    }
    else if(poz>mij){ ///fiu dr
      update(2*nod+1,mij+1,dr,poz,val);
    }
    aint[nod]=std::max(aint[2*nod],aint[2*nod+1]); ///recalculam nodul daca se modifica cu val noi
  }
}

int query(int nod,int st,int dr,int left,int right){
  if(st==left&&dr==right){ ///am gasit intervalul cautat
    return aint[nod];
  }
  else{
    int mij=(st+dr)/2;
    if(right<=mij){ ///fiu stg
      return query(2*nod,st,mij,left,right);
    }
    else if(left>mij){ ///fiu dr
      return query(2*nod+1,mij+1,dr,left,right);
    }
    else{ ///ambele
      return std::max(query(2*nod,st,mij,left,mij),query(2*nod+1,mij+1,dr,mij+1,right));
    }
  }
}

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=1;i<=n;i++){
    fscanf(fin,"%d",&v[i]);
    update(1,1,n,i,v[i]);
  }
  for(i=1;i<=m;i++){
    fscanf(fin,"%d%d%d",&q,&a,&b);
    if(q==1){
      update(1,1,n,a,b); ///a=poz, b=val
    }
    else if(q==0){
      fprintf(fout,"%d\n",query(1,1,n,a,b)); ///a=left, b=right
    }
  }

  fclose(fin);
  fclose(fout);
  return 0;
}