Cod sursa(job #181904)

Utilizator spaulc90Sarbu Paul Cristian spaulc90 Data 19 aprilie 2008 10:50:35
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream.h>

long v[100000], arb[200000], n, m, i;
long x, y, z;
long rez;


//fnctia de update
void update (int nod, int in, int sf, int poz, int val)
{
 if (in == sf)
 {
  arb[nod] = val;
  return;
 }

 int mj;
 mj = (in + sf) / 2;

 if (poz <= mj)
  update (2*nod, in, mj, poz, val);
  else
   update (2*nod+1, mj+1, sf, poz, val);

 if (arb[2*nod] > arb[2*nod+1])
  arb[nod] = arb[2*nod];
  else
   arb[nod] = arb[2*nod+1];
}


//functia de maxim pe intervalul [a, b]
void query (int nod, int in, int sf, int a, int b)
{
 if (a <= in  &&  sf <= b)
 {
  if (arb[nod] > rez)
   rez = arb[nod];
  return;
 }

 int mj;
 mj = (in + sf) / 2;

 if (a <= mj)
  query (2*nod, in, mj, a, b);
 if (mj+1 <= b)
  query (2*nod+1, mj+1, sf, a, b);
}


int main()
{
 ifstream fin("arbint.in");
 ofstream fout ("arbint.out");


 fin >> n >> m;

 for (i=1; i<=n; i++)
 {
  fin >> v[i];
  update (1, 1, n, i, v[i]);
 }

 for (i=1; i<=m; i++)
 {
  fin >> x >> y >> z;
  if (x == 0)
  {
   rez = -1;
   query (1, 1, n, y, z);
   fout << rez << '\n';
  }
  else
   update (1, 1, n, y, z);
 }


 fin.close();
 fout.close();

 return 0;
}