Mai intai trebuie sa te autentifici.
Cod sursa(job #540207)
Utilizator | Data | 23 februarie 2011 19:52:50 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.09 kb |
#include <cstdio>
int v[100002],a[1<<18],n,q,w;
inline int max(int a, int b) { return (a > b ? a : b); }
int get(int poz,int l,int r,int x,int y)
{
if ((l==x) && (r==y)) return a[poz];
int mij=(l+r)/2;
if (x>mij) return get(poz*2+1,mij+1,r,x,y); else
if (y<=mij) return get(poz*2,l,mij,x,y); else
return max(get(poz*2,l,mij,x,mij),get(poz*2+1,mij+1,r,mij+1,y));
}
void init(int poz,int l,int r)
{
if (l==r) {a[poz]=v[l];return ;}
int mij=(l+r)/2;
init(poz*2,l,mij);
init(poz*2+1,mij+1,r);
a[poz]=max(a[poz*2],a[poz*2+1]);
}
void upd(int poz,int l,int r)
{
if (l==r) {a[poz]=w; return ;}
int mij=(l+r)/2;
if (q<=mij) upd(poz*2,l,mij); else
upd(poz*2+1,mij+1,r);
a[poz]=max(a[poz*2],a[poz*2+1]);
}
int main()
{ int m,i,j,t,x,y,p;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for (i=1;i<=n;++i) scanf("%d",&v[i]);
init(1,1,n);
while (m--)
{
scanf("%d %d %d",&t,&x,&y);
if (t==1)
q=x,w=y,upd(1,1,n);
else
printf("%d\n",get(1,1,n,x,y));
}
return 0;
}