Cod sursa(job #144314)

Utilizator DastasIonescu Vlad Dastas Data 27 februarie 2008 13:57:50
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <cstdio>

const int maxn = 100001;
const int maxi = 1 << 18;

FILE *in = fopen("arbint.in","r"), *out = fopen("arbint.out","w");

int n, m;
int a[maxn];
int d[maxi];

void read()
{
    fscanf(in, "%d %d", &n, &m);

    for ( int i = 1; i <= n; ++i )
        fscanf(in, "%d", &a[i]);
}

inline int max(int x, int y)
{
    return x > y ? x : y;
}

void build(int nod, int st, int dr)
{
    if ( st == dr )
    {
        d[nod] = a[st];
        return;
    }

    int q = nod << 1;
    int m = (st + dr) >> 1;

    build(q, st, m);
    build(q+1, m+1, dr);

    d[nod] = max(d[q], d[q+1]);
}

int answ, p, q;
void query(int nod, int st, int dr)
{
    if ( q < st || p > dr )
        return;

    if ( p <= st && dr <= q )
    {
        answ = max(answ, d[nod]);
        return;
    }

    int q = nod << 1;
    int m = (st + dr) >> 1;

    query(q, st, m);
    query(q+1, m+1, dr);
}

int what, becomes;
void update(int nod, int st, int dr)
{
    if ( what < st || what > dr )
        return;

    if ( st == dr )
    {
        if ( st == what )
            d[nod] = what;

        return;
    }

    int q = nod << 1;
    int m = (st + dr) >> 1;

    update(q, st, m);
    update(q+1, m+1, dr);

    d[nod] = max(d[q], d[q+1]);
}

int main()
{
    read();
    build(1, 1, n);

    int x, y, z;
    for ( int i = 1; i <= m; ++i )
    {
        fscanf(in, "%d %d %d", &x, &y, &z);

        if ( !x )
        {
            answ = -4;
            p = y, q = z;
            query(1, 1, n);
            fprintf(out, "%d\n", answ);
        }
        else
        {
            what = y;
            becomes = z;
            update(1, 1, n);
        }
    }
	return 0;
}