Cod sursa(job #613090)

Utilizator bogfodorBogdan Fodor bogfodor Data 15 septembrie 2011 18:58:51
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
#include <algorithm>
#define Lmax 100001
using namespace std;

int a[Lmax],s[Lmax*4],n,m;

FILE *fin=freopen("arbint.in","r",stdin);
FILE *fout=freopen("arbint.out","w",stdout);

void citire()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d ",&a[i]);
}

void build(int st, int dr, int nod)
{
    if(st==dr)
    {
        s[nod]=a[st];
        return;
    }
    int mid=(st+dr)>>1;
    build(st,mid,nod<<1);
    build(mid+1,dr,(nod<<1)+1);
    s[nod]=max(s[nod<<1],s[(nod<<1)+1]);
}
int maxg=-1111,nr,poz;

void update(int st, int dr, int nod)
{
    if(st==dr)
    {
        s[nod]=nr;
        return;
    }
    int mid=(st+dr)>>1;
    if(poz<=mid)
        update(st,mid,nod<<1);
    else
        update(mid+1,dr,(nod<<1)+1);
    s[nod]=max(s[nod<<1],s[(nod<<1)+1]);
}

void maxim(int st, int dr, int S, int D, int nod)
{
    if(st>=S && dr<=D)
    {
        maxg= max(maxg,s[nod]);
        return ;
    }
    int mid=(st+dr)>>1;
    if(S<=mid)
        maxim(st,mid,S,D,nod<<1);
    if(D>mid)
        maxim(mid+1,dr,S,D,(nod<<1)+1);
}

int main()
{
    citire();
    build(1,n,1);
    int a,b,q;
    while(m--)
    {
        scanf("%d %d %d",&q,&a,&b);
        if(q==0)
        {
            maxg=-1111;
            maxim(1,n,a,b,1);
            printf("%d\n",maxg);
        }
        else
        {
            nr=b;
            poz=a;
            update(1,n,1);
        }
    }
    return 0;
}