Cod sursa(job #2392578)

Utilizator dragos03dragos popescu septimiu dragos03 Data 30 martie 2019 10:46:27
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>

#define MAXN 100050

using namespace std;
int arb[4*MAXN],n,m,a[MAXN];
ifstream f("arbint.in");
ofstream g("arbint.out");

void update(int val,int pos,int ind=1,int st=1,int dr=n)
{if(st==dr)
{arb[ind]=val;
return;}
int mid= (st+dr)/2;
if(pos<=mid)
update(val,pos,ind<<1,st,mid);
else
update(val,pos,ind<<1|1,mid+1,dr);
arb[ind]=max(arb[ind<<1],arb[ind<<1|1]);
}

void build(int ind=1,int st=1,int dr=n)
{if(st==dr)
{
    arb[ind]=a[st];
    return;
}
int mij=(st+dr)/2;
build(ind<<1,st,mij);
build(ind<<1|1,mij+1,dr);
arb[ind]=max(arb[ind<<1],arb[ind<<1|1]);}

int query(int qst,int qdr,int ind=1,int st=1,int dr=n)
{if(qst<=st&&dr<=qdr)
    return arb[ind];
int mid=(st+dr)/2;
if(qdr<=mid)
    return query(qst,qdr,ind<<1,st,mid);
if(qst>mid)
    return query(qst,qdr,ind<<1|1,mid+1,dr);
return max(query(qst,qdr,ind<<1,st,mid),query(qst,qdr,ind<<1|1,mid+1,dr));
}

void read()
{f>>n>>m;
for(int i=1;i<=n;i++)
f>>a[i];
build();
}



int main()
{read();
for(int i=0;i < m;i++)
{int op,x,y;
f>>op>>x>>y;
if(op==0)
g<<query(x,y)<<'\n';
else
update(y,x);
}


    return 0;
}