Cod sursa(job #1895581)

Utilizator denniscrevusDennis Curti denniscrevus Data 28 februarie 2017 01:50:55
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#define NMAX 100005

using namespace std;

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

int v[NMAX], arb[3*NMAX], n, m, i, x, cif, y;

void update(int st, int dr, int poz, int nod)
{
    if(st == dr)
    {
        arb[nod] = v[poz];
        return;
    }

    int mid = ((st+dr)>>1);

    if(mid >= poz)
        update(st, mid, poz, (nod<<1));
    if(mid < poz)
        update(mid+1, dr, poz, (nod<<1)+1);

    arb[nod] = max(arb[nod<<1], arb[(nod<<1)+1]);
}

int querry(int st, int dr, int st1, int dr1, int nod)
{
    if(st == st1 && dr == dr1)
        return arb[nod];

    int mid = (st+dr)/2;

    if(mid >= dr1)
        return querry(st, mid, st1, dr1, (nod<<1));

    if(mid < st1)
        return querry(mid+1, dr, st1, dr1, (nod<<1)+1);

    return max(querry(st, mid, st1, mid, (nod<<1)), querry(mid+1, dr, mid+1, dr1, (nod<<1)+1));
}

int main()
{
    f>>n>>m;

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

    for(i=1;i<=m;i++)
    {
        f>>cif>>x>>y;

        if(cif)
        {
            v[x] = y;
            update(1,n,x,1);
        }

        else
            g<<querry(1,n,x,y,1)<<"\n";
    }
}