Cod sursa(job #185497)

Utilizator gigi_becaliGigi Becali gigi_becali Data 25 aprilie 2008 15:43:28
Problema Arbori de intervale Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
using namespace std;
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#define N 100001
#define sqr 600
int x[N], b[sqr];
int n,m;

inline void update(int p, int v)
{
    x[p]=v;
    int i;
    for(i=max(p-sqr, 1); i<= min( p+sqr, n);++i)
	b[i/sqr]=max(b[i/sqr], x[i]);

}


inline int query(int l, int r)
{

    int sol=0,i;

    for(i=l;i<= min(r, l+sqr); ++i) sol=max(x[i], sol);

    for(i=max(r-sqr, l); i<=r; ++i) sol=max(x[i], sol);

    for(i=l/sqr+1;i<=r/sqr;++i) sol=max(b[i], sol);

    return sol;
}


int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d\n", &n,&m);
    int i;
    for(i=1;i<=n;++i)scanf("%d ", x+i);
    

    int t, p, q;
    while(m--)
    {
	scanf("%d %d %d\n", &t, &p, &q);
	if(t==0) printf("%d\n", query(p, q));
	else update(p,q);
    }

    return 0;
}