Cod sursa(job #1379909)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 6 martie 2015 20:19:26
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<cstdio>
#include<algorithm>
using namespace std;
const int nmax=100000;
int ai[nmax*2+5];
void up(int nod,int st,int dr,int pos,int val)
{
    if(st==dr)
    {
    ai[nod]=val;
    return ;
    }
    int mi;
    mi=(st+dr)/2;
    if(pos<=mi)
    up(nod*2,st,mi,pos,val);
    else
    up(nod*2+1,mi+1,dr,pos,val);

    ai[nod]=max(ai[nod*2],ai[nod*2+1]);
}
int qry(int nod,int st,int dr,int x,int y)
{
    int mx=0;
    if((st==x && dr==y) || st>=dr)
    mx=ai[nod];
    else
    {
        int mi=(st+dr)/2;
        if(y<=mi)
            mx=max(mx,qry(nod*2,st,mi,x,y));
        else
        if(x>mi)
            mx=max(mx,qry(nod*2+1,mi+1,dr,x,y));
        else
        {
        mx=max(mx,qry(nod*2,st,mi,x,mi));
        mx=max(mx,qry(nod*2+1,mi+1,dr,mi+1,y));
        }
    }
    return mx;
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,m,i,j,mx,pos,val,op;
    scanf("%d%d\n",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&val);
        up(1,1,n,i,val);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&op,&pos,&val);
        if(op==1)
        up(1,1,n,pos,val);
        else
        {
            // x y
            printf("%d\n",qry(1,1,n,pos,val));
        }
    }
    return 0;
}