Pagini recente » Cod sursa (job #1464021) | Cod sursa (job #1772774) | Cod sursa (job #70164) | Cod sursa (job #952845) | Cod sursa (job #2858627)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int v[100001],indice[100001],n,m;
int arb[500500];
int i,j,cerinta,a,b;
void construire(int st,int dr,int poz)
{
if(st==dr)
{
arb[poz]=v[st];
indice[st]=poz;
return ;
}
int mij=(st+dr)/2;
construire(st,mij,poz*2);
construire(mij+1,dr,poz*2+1);
arb[poz]=max(arb[poz*2],arb[poz*2+1]);
}
int maxim(int st,int dr,int poz)
{
int mij=(st+dr)/2;
if(dr<a||st>b) return 0;
if(a<=st&&b>=dr) return arb[poz];
return max(maxim(st,mij,poz*2),maxim(mij+1,dr,poz*2+1));
}
void reactualizare(int poz)///refacem tatii
{
if(poz)
{
arb[poz]=max(arb[poz*2],arb[poz*2+1]);
reactualizare(poz/2);
}
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
f>>v[i];
construire(1,n,1);
for(i=1;i<=m;i++)
{
f>>cerinta>>a>>b;
if(cerinta==0)
{
g<<maxim(1,n,1)<<'\n';
}
else
{
arb[indice[a]]=b;
reactualizare(indice[a]/2);
}
}
return 0;
}