Pagini recente » Cod sursa (job #1750891) | Cod sursa (job #242584) | Profil Raul2325 | Cod sursa (job #1290900) | Cod sursa (job #2026076)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int a[100010],n,m,sol;
int x, y, c;
struct st
{
int st, dr, val;
}tree[131000];
int fiu_st(int x)
{
return (x*2);
}
int fiu_dr(int x)
{
return (x*2+1);
}
void biuld (int nod, int caps, int capd)
{
if (caps!=capd)
{
tree[nod].st=caps;
tree[nod].dr=capd;
biuld (fiu_st(nod),caps, (caps+capd)/2);
biuld (fiu_dr(nod),(caps+capd)/2+1, capd);
tree[nod].val=max(tree[fiu_st(nod)].val,tree[fiu_dr(nod)].val);
}
if (caps==capd)
{
tree[nod].st=caps;
tree[nod].dr=capd;
tree[nod].val=a[caps];
}
}
void adauga (int nod,int poz, int vall)
{
if (tree[nod].st!=tree[nod].dr)
{
if ( (tree[nod].st+tree[nod].dr)/2< poz ) adauga (nod*2+1, poz, vall);
else adauga (nod*2, poz, vall);
tree[nod].val=max(tree[nod*2].val,tree[nod*2+1].val);
}
else
{
// cout<<nod<<" "<<tree[nod].st;
tree[nod].val=y;
}
}
void verifica (int nod, int stt, int drr)
{
int mid=tree[nod].st+tree[nod].dr;
mid/=2;
if (stt==tree[nod].st && drr==tree[nod].dr) sol=max(sol,tree[nod].val);
if (stt< mid && drr<=mid) verifica (nod*2, stt, drr);
if (stt<=mid && drr>=mid+1)
{
verifica (nod*2, stt, mid);
verifica (nod*2+1, mid+1, drr);
}
if (stt>mid) verifica (nod*2+1, stt, drr);
}
int main()
{
int i;
f>>n>>m;
for (i=1;i<=n;i++)
{
f>>a[i];
}
biuld (1, 1, n);
for (i=1;i<=m;i++)
{
f>>c>>x>>y;
sol=0;
if (c==1) adauga(1,x, y);
else
{
verifica (1, x, y);
g<<sol<<"\n";
}
}
return 0;
}