Cod sursa(job #1060640)

Utilizator Simona13Simona Mihalca Simona13 Data 18 decembrie 2013 11:17:42
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<iostream>
#include<fstream>
using namespace std;
 
int n, m;
int a[262145], L, R, val, poz, maxim;
 
inline int Max(int a, int b)
{ return (a > b ? a : b);
}
 
void build(int nod, int stg, int drt)
{
    if (stg == drt)
    {
        a[nod] = val;
        return;
    }
     
  int m = (stg+drt)>>1, fs = nod<<1;
    if (poz <= m) build(fs, stg, m);
    else build(fs+1, m+1, drt);
     
    a[nod] = Max(a[fs], a[fs+1]);
}
 
void get_max(int nod, int stg, int drt)
{
    if (L <= stg && drt <= R)
       if (maxim < a[nod]) 
          maxim = a[nod];
    else
        { int m = (stg+drt)>>1, fs = nod<<1; //(stg+drt)/2 nod*2
         if (L <= m) get_max(fs, stg, m);
         if (m < R) get_max(fs+1, m+1, drt);
       }
}
 
int main()
{ifstream f("arbint.in");
ofstream g("arbint.out");
int a, b, c, i;
f>>n>>m;
    for (i=1;i<=n;++i)
    {f>>c;
    poz = i;
    val = c;
    build(1, 1, n);
    }
     
    for (i=1;i<=m;++i)
    {f>>c>>a>>b;
        
        if (!c)
        {              
            maxim = 0;
            L = a; R = b;
            get_max(1, 1, n);
            g<<maxim<<"\n";

        }
        else
        {   poz = a, val = b;
            build(1, 1, n);
        }
    }
  f.close();
  g.close(); 
  system("pause");
    return 0;
}