Pagini recente » Cod sursa (job #2357678) | Atasamentele paginii oji200424234 | Cod sursa (job #2018848) | Diferente pentru olimpici intre reviziile 180 si 126 | Cod sursa (job #3186259)
#include<fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct nod
{
int st,dr;
int maxi;
nod *left,*right;
}root;
nod build(int st,int dr,int v[])
{
nod a;
a.st=st;
a.dr=dr;
if(st==dr)
{
a.maxi=v[st];
a.left=a.right=NULL;
return a;
}
int mij=(st+dr)/2;
a.left = new nod;
a.right = new nod;
*(a.left) = build(st,mij,v);
*(a.right) = build(mij+1,dr,v);
a.maxi=max(a.left->maxi,a.right->maxi);
return a;
}
int query(int st,int dr,nod &nc)
{
if(dr < nc.st || st > nc.dr)
return -1;
if(dr >= nc.dr && st <= nc.st)
return nc.maxi;
return max(query(st,dr,*(nc.left)),query(st,dr,*(nc.right)));
}
void update(int p,int nval,nod &nc)
{
if(nc.dr < p || nc.st > p)
return;
if(nc.st == p && nc.dr == p)
{
nc.maxi = nval;
return;
}
update(p,nval,*(nc.left));
update(p,nval,*(nc.right));
nc.maxi = max(nc.left->maxi,nc.right->maxi);
}
int main()
{
int n,m,v[100005];
int t,a,b;
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>v[i];
}
root = build(1,n,v);
for(int i=1;i<=m;i++)
{
fin>>t>>a>>b;
if(t==0)
{
fout<<query(a,b,root)<<'\n';
}
if(t==1)
{
update(a,b,root);
}
}
}