Cod sursa(job #1772905)

Utilizator BarbumateiBarbu Matei Barbumatei Data 7 octombrie 2016 10:36:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 kb
#include <cstdio>
#include <cctype>
#define BUFF_SIZE (1<<17)
#define MAXN 1000000
#define max2(a, b) ( a>b ? a : b )
FILE *fin, *fout;
int n, pos=BUFF_SIZE, pos1, poz, rasp, left, right;
signed char buff[BUFF_SIZE], buff1[BUFF_SIZE], ch;
int v[MAXN+1], arb[MAXN+1];

inline char next(){
  if(pos==BUFF_SIZE){
    fread(buff, BUFF_SIZE, 1, fin);
    pos=0;
  }
  return buff[pos++];
}

inline int read(){
  int x=0;
  ch=next();
  while(!isdigit(ch)) ch=next();
  while(isdigit(ch)){
    x=x*10+ch-'0';
    ch=next();
  }
  return x;
}

inline void baga(){
  buff1[pos1++]=ch;
  if(pos1==BUFF_SIZE){
    fwrite(buff1, BUFF_SIZE, 1, fout);
    pos1=0;
  }
}

inline void insert(int x){
  char s[10];
  int k=0;
  do{
    s[k++]=x%10+'0';
    x/=10;
  }while(x);
  while(k>0){
    k--;
    ch=s[k];
    baga();
  }
}

inline void start(int leaf, int left, int right){
  if(left==right){
    arb[leaf]=v[left];
    return;
  }
  int m=(left+right)/2;
  start(2*leaf+1, left, m);
  start(2*leaf+2, m+1, right);
  arb[leaf]=max2(arb[leaf*2+1], arb[leaf*2+2]);
}

inline void update(){
  int leaf=0, left=0, right=n-1, m;
  while(left<right){
    m=(left+right)/2;
    if(poz<=m) right=m, leaf=leaf*2+1;
    else left=m+1, leaf=leaf*2+2;
  }
  ///facem o cautare binara ca sa vedem pe ce nod e intervalul (poz, poz)
  arb[leaf]=v[left];
  leaf=(leaf-1)/2;
  while(leaf){
    arb[leaf]=max2(arb[leaf*2+1], arb[leaf*2+2]);
    leaf=(leaf-1)/2;
  }
  arb[leaf]=max2(arb[leaf*2+1], arb[leaf*2+2]);
}

inline void query(int leaf, int st, int dr){
  if(left<=st && dr<=right){
    rasp=max2(rasp, arb[leaf]);///daca (st, dr) e inclus in (left, right)
    return;
  }
  int m=(st+dr)/2;
  if(left<=m) query(leaf*2+1, st, m);///investigam fiecare child node
  if(right>=m+1) query(leaf*2+2, m+1, dr);
}

int main(){
  int m, a, b, x, i;
  fin=fopen("arbint.in", "r");
  fout=fopen("arbint.out", "w");
  n=read();
  m=read();
  for(i=0; i<n; i++)
    v[i]=read();
  start(0, 0, n-1);
  for(i=0; i<m; i++){
    x=read();
    a=read();
    b=read();
    if(x==0){
      left=a-1; right=b-1;
      rasp=0;
      query(0, 0, n-1);
      insert(rasp);
      ch='\n';
      baga();
    }
    else{
      poz=a-1;
      v[poz]=b;
      update();
    }
  }
  if(pos1>0) fwrite(buff1, pos1, 1, fout);
  fclose(fin);
  fclose(fout);
    return 0;
}