Mai intai trebuie sa te autentifici.
Cod sursa(job #1506545)
Utilizator | Data | 20 octombrie 2015 19:40:20 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.2 kb |
#include <iostream>
#include <fstream>
#define mx 100001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, a[3*mx], i, x, y, Mx;
bool cond;
int maxim(int c, int b)
{
if(c > b)
return c;
return b;
}
void update(int st, int dr, int p)
{
if(st == dr)
{
a[p] = y;
return;
}
int mij=(st+dr)/2;
if(mij >= x)
update(st, mij, p*2);
else
update(mij+1, dr, p*2+1);
a[p] = maxim(a[p*2], a[p*2+1]);
}
void query(int st, int dr, int p)
{
if(x <= st && y >= dr)
{
Mx = maxim(Mx, a[p]);
return;
}
int mij = (st + dr) / 2;
if(x <= mij)
query(st, mij, 2*p);
if(y > mij)
query(mij+1, dr, 2*p+1);
}
void rezolvare()
{
fin >> n >> m;
for(x=1; x<=n; x++)
{
fin >> y;
update(1, n, 1);
}
for(i=1; i<=m; i++)
{
fin >> cond >> x >> y;
if(cond == 0)
{
Mx = -1;
query(1, n, 1);
fout<<Mx<<"\n";
}
else
update(1, n, 1);
}
}
int main()
{
rezolvare();
return 0;
}