Cod sursa(job #2095870)

Utilizator infomaxInfomax infomax Data 28 decembrie 2017 12:47:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>

using namespace std;

ifstream F("arbint.in");
ofstream G("arbint.out");

int n, m, v[100003], t[400003], j, x, y, z, ans, k, p;
const int inf = 1 << 30;

void upd(int rad, int st, int dr)
{
    if(st == dr)
    {
        t[rad] = k;
        return;
    }
    int mij = (st+dr)>>1;
    if( p <= mij ) upd(2*rad, st, mij);
    else upd(2*rad+1, mij + 1, dr);
    t[rad] = max(t[2*rad], t[2*rad+1]);
}

void Max(int l, int r, int st, int dr, int rad)
{
    if(l<=st && dr<=r)
    {
        ans = max(ans, t[rad]);
        return;
    }
    if( l > dr || r < st ) return;
    int mij = (st+dr)>>1;
    Max( l, r, st, mij, 2*rad );
    Max( l, r, mij+1, dr, 2*rad+1 );
}

int main()
{
    F >> n >> m;
    for( int i = 1; i <= n; ++ i )
    {
        F >> v[i];
        k = v[i];
        p = i;
        upd(1, 1, n);
    }
    for( int i = 1; i <= m; ++ i )
    {
        F >> x >> y >> z;
        if(!x)
        {
            ans = -inf;
            Max(y, z, 1, n, 1);
            G << ans << '\n';
        }
        else
        {
            k = z;
            p = y;
            upd(1, 1, n);
        }
    }
    return 0;
}