Pagini recente » Cod sursa (job #1948983) | Cod sursa (job #2339029) | Cod sursa (job #1383215) | Cod sursa (job #1459030) | Cod sursa (job #563557)
Cod sursa(job #563557)
#include <fstream>
using namespace std;
const int N = 100006;//100001
const int ARB = 1<<18;//putere 2 min > N
const int INF = 2000000000;
int v[N],n;
int arb[ARB]; int poz_frunza[N];
ifstream in("arbint.in");
ofstream out("arbint.out");
int max(int a, int b)
{
return (a>b)?a:b;
}
void gasire_frunze(int st, int dr, int poz)
{
int mij;
if (st == dr)
{
poz_frunza[st] = poz;
return;
}
mij = (st+dr)/2;
gasire_frunze(st,mij,2*poz);
gasire_frunze(mij+1,dr,2*poz+1);
}
void actualizare_valoare(int i, int val)
{
int poz = poz_frunza[i];
arb[poz] = val;
for (poz /= 2; poz >= 1; poz /= 2)
arb[poz] = max(arb[2*poz],arb[2*poz+1]);
}
int x,y;//x;y folositi de query
int query(int st, int dr, int poz)
{
if ((x <= st)&&(dr <= y))//intervalul [st,dr] este folosit in intregime la raspundere
return arb[poz];
if ((dr < x)||(y < st))//intervalul [st,dr] este complet inutil in raspunderea pt intervalul [a,b];
return -INF;
int mij = (st+dr)/2;
return max(query(st,mij,2*poz),query(mij+1,dr,2*poz+1));
}
int interogare(int a, int b)
{
x = a;
y = b;
return query(1,n,1);
}
void citire_si_rezolvare()
{
int q,op,x,y;
in>>n>>q;
gasire_frunze(1,n,1);
for (int i = 1; i <= n; ++i)
{
in>>v[i];
actualizare_valoare(i,v[i]);
}
for (int i = 1; i <= q; ++i)
{
in>>op>>x>>y;
if (op == 0)
out<<interogare(x,y)<<"\n";
else
actualizare_valoare(x,y);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
citire_si_rezolvare();
return 0;
}