Mai intai trebuie sa te autentifici.
Cod sursa(job #1260044)
Utilizator | Data | 10 noiembrie 2014 20:38:10 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.32 kb |
#include <fstream>
using namespace std ;
const int NMAX = 1000005 ;
const int INF = 0x3f3f3f3f ;
ifstream fin("arbint.in") ;
ofstream fout("arbint.out") ;
int Pos, Val;
int Graph[NMAX * 4] ;
int maxim;
int N, M ;
int st, dr ;
void UPGRADE(int nod, int left, int right)
{
if(left == right)
{
Graph[nod] = Val ;
return ;
}
int mijloc = (left + right) / 2 ;
if(mijloc >= Pos) UPGRADE(2 * nod, left, mijloc) ;
else UPGRADE(2 * nod + 1, mijloc + 1, right) ;
Graph[nod] = max(Graph[2 * nod], Graph[2 * nod + 1]) ;
}
void DET(int nod, int left, int right)
{
if(st <= left && dr >= right)
{
if(maxim < Graph[nod])
maxim = Graph[nod] ;
return ;
}
int mijloc = (left + right) / 2 ;
if(st <= mijloc) DET(2 * nod, left, mijloc) ;
if(mijloc < dr) DET(2 * nod + 1, mijloc + 1, right) ;
}
int main()
{
fin >> N >> M ;
for(int i = 1 ; i <= N ; ++ i)
{
int X ;
fin >> X ;
Pos = i ;
Val = X ;
UPGRADE(1, 1, N) ;
}
for(int i = 1 ; i <= M ; ++ i)
{
int X ;
int A, B ;
fin >> X ;
fin >> A >> B ;
if(X == 1)
{
Val = B ;
Pos = A ;
UPGRADE(1, 1, N);
}
else {
st = A ;
dr = B ;
maxim = -1;
DET(1, 1, N) ;
fout << maxim << '\n' ;
}
}
fin.close() ;
fout.close() ;
return 0 ;
}