Cod sursa(job #1565745)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 11 ianuarie 2016 11:58:06
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

#define ll long long
#define LE 1000666

int a[LE];
int Arb[LE];
int result;


void query(int l,int r,int nod,int X,int Y)
{
    int mid=(l+r)/2;
    if (l==r)
    {
        result=max(result,Arb[nod]);
        return;
    }
    if (X<=mid) query(l,mid,nod*2,X,Y);
    if (Y>mid) query(mid+1,r,nod*2+1,X,Y);
}

void update(int l,int r,int nod,int pos)
{
    int mid=(l+r)/2;
    if (l==r)
    {
        Arb[nod]=a[pos];
        return ;
    }

    if (pos<=mid) update(l,mid,nod*2,pos);
    else update(mid+1,r,nod*2+1,pos);

    Arb[nod]=max(Arb[nod*2],Arb[nod*2+1]);
}

int main()
{
    int n,m,i;

    f>>n>>m;

    for(i=1; i<=n; ++i)
    {
        f>>a[i];
        update(1,n,1,i);
    }


    for(i=1; i<=m; ++i)
    {
        int typ,xx,yy;
        f>>typ;

        if (typ==0)
        {
            f>>xx>>yy;
            result=0;
            query(1,n,1,xx,yy);
            g<<result<<'\n';
        }

        if (typ==1)
        {
            f>>xx>>yy;
            a[xx]=yy;
            update(1,n,1,xx);
        }
    }


    return 0;
}