Cod sursa(job #220752)

Utilizator FlorianFlorian Marcu Florian Data 12 noiembrie 2008 15:23:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<stdio.h>
#define Max 100000
FILE*f=fopen("arbint.in","r");
FILE*g=fopen("arbint.out","w");
int H[3*Max+3],n,m;
inline int min(int a, int b)
 {
 if(a>b) return a;
 return b;
 }
inline void update(int node, int left, int right, int i, int v) //pe pozitia i pun valoarea v
 {
  if(left>=right) { H[node]=v; return;}
  int middle=(left+right)/2;
  if(i<=middle) update(2*node, left, middle, i, v);
  else update(2*node+1,middle+1,right,i,v);

  H[node]=min(H[2*node],H[2*node+1]);
 }
inline int query(int node, int left, int right, int i, int j)
 {
 if(i<=left && j>=right) return H[node];
 int middle=(left+right)/2;
 int sol=-1;
 if(i<=middle) sol=min(sol, query(2*node,left,middle,i,j));
 if(j>middle) sol=min(sol, query(2*node+1, middle+1, right, i,j));
 return sol;
 }
int main()
 {
 int x,i,a,b;
 fscanf(f,"%d%d",&n,&m);
 for(i=1;i<=n;++i)
  {
   fscanf(f,"%d",&x);
   update(1,1,n,i,x);
  }
 while(m--)
  {
  fscanf(f,"%d%d%d",&x,&a,&b);
  if(x==0) fprintf(g,"%d\n",query(1,1,n,a,b));
  else update(1,1,n,a,b);
  }
 return 0;
 
 }