Pagini recente » Cod sursa (job #1058358) | Cod sursa (job #2207289) | Cod sursa (job #1102394) | Cod sursa (job #2473622) | Cod sursa (job #2182514)
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
struct pct{
int val, pos;
}valoare;
struct quer{
int stanga, dreapta;
}query;
int n, tree[nmax*4],m,tip;
void calcularemax(int pozitie)
{
tree[pozitie]=max(tree[pozitie*2],tree[pozitie*2+1]);
return;
}
void update(int st, int dr, int pozitie)
{
if (st==dr)
{
tree[pozitie]=valoare.val;
return;
}
int mij=(st+dr)/2;
if (valoare.pos<=mij)
{
update(st,mij,2*pozitie);
}
else
{
update(mij+1,dr,2*pozitie+1);
}
calcularemax(pozitie);
}
int cautaremax(int st, int dr, int pozitie)
{
if (st>=query.stanga && dr<=query.dreapta)
{
return tree[pozitie];
}
if (st>query.dreapta || dr<query.stanga)
return 0;
int mij=(st+dr)/2;
return max(cautaremax(st,mij, pozitie*2),cautaremax(mij+1,dr,pozitie*2+1));
}
int main()
{
f >> n >> m;
for (int i=1; i<=n; i++)
{
f >> valoare.val;
valoare.pos=i;
update(1,n,1);
}
for (int i=0; i<n; i++)
{
f >> tip;
if (tip==1)
{
f >> valoare.pos >> valoare.val;
update(1,n,1);
}
else
{
f >> query.stanga >> query.dreapta;
g << cautaremax(1,n,1) << endl;
}
}
return 0;
}