Cod sursa(job #625868)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 25 octombrie 2011 19:11:41
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<stdio.h>
#include<assert.h>
#include<algorithm>
using namespace std;

struct request
{
    int x,y,z;
};

int n,m,u,mid;
long long a[300100],sol[100100];
request b[100100];

void update(long long val,int poz,int st,int dr,int cu)
{
    if(st==poz && dr==poz)
    {
        a[cu]=val;
        return;
    }
    mid=(st+dr)/2;
    if(poz<=mid)
        update(val,poz,st,mid,cu*2);
    else
        update(val,poz,mid+1,dr,cu*2+1);
    a[cu]=max(a[cu*2],a[cu*2+1]);
}

int query(int stx,int drx,int st,int dr,int cu)
{
    if(st>=stx && dr<=drx)
        return a[cu];
    mid=(st+dr)/2;
    if(stx<=mid && drx>mid)
        return max(query(stx,drx,st,mid,cu*2),query(stx,drx,mid+1,dr,cu*2+1));
    if(drx<=mid)
        return query(stx,drx,st,mid,cu*2);
    return query(stx,drx,mid+1,dr,cu*2+1);
}
void read()
{
    assert(freopen("arbint.in","r",stdin)!=NULL);
    int i,x;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&x);
        update(x,i,1,n,1);
    }
    for(i=1;i<=m;++i)
        scanf("%d%d%d",&b[i].z,&b[i].x,&b[i].y);
}

void solve()
{
    int i;
    for(i=1;i<=m;++i)
        if(b[i].z==0)
            sol[++u]=query(b[i].x,b[i].y,1,n,1);
        else
            update(b[i].y,b[i].x,1,n,1);
}

void write()
{
    assert(freopen("arbint.out","w",stdout)!=NULL);
    int i;
    for(i=1;i<=u;++i)
        printf("%lld\n",sol[i]);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}