Cod sursa(job #1568938)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 14 ianuarie 2016 20:57:20
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.78 kb
#include <fstream>
#include <cmath>
#include <cstring>

#define left first
#define right second
#define BMAX 100010 * 5
#define DIM 100010

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int p, N, M, a, b, op, buffer, v[DIM], A[320], pozA[320];
char buf[BMAX];
pair<int, int> interval[320];

void gint(int &ans) {
    ans = 0;
    while (buf[buffer]<'0' || buf[buffer]>'9') {
    buffer++;
    if (buffer == BMAX - 1) {
        fin.get(buf, BMAX, EOF);
        buffer = 0;
        }
    }
    while (buf[buffer] >= '0'&&buf[buffer] <= '9') {
        ans = ans * 10 + buf[buffer++] - '0';
    if (buffer == BMAX - 1) {
        fin.get(buf, BMAX, EOF);
        buffer = 0;
        }
    }
}

void update()
{
    v[a] = b;

    int i;

    if(a / p  == 1.0 * a / p)
    {
        i = a / p;
    }
    else
    {
        i = a / p + 1;
    }
    if(pozA[i] != a)
    {
        if(b < pozA[i])
        {
            return;
        }
        else
        {
            pozA[i] = b;
            A[i] = b;
        }
    }
    else
    {
            A[i] = 0;

            for(int j = interval[i].left; j <= interval[i].right; j ++)
            {
                if(v[j] > A[i])
                {
                    pozA[i] = j;
                    A[i] = v[j];
            }
            }
    }

}

int query()
{
    int st, dr;
    if(a / p  == 1.0 * a / p)
    {
        st = a / p + 1;
    }
    else
    {
        st = a / p + 2;
    }
    if(b / p  == 1.0 * b / p)
    {
        dr = b / p + 1;
    }
    else
    {
        dr = b / p;
    }


    int solution = 0;

    for(int i = st; i <= dr; i ++)
    {
        solution = max(solution, A[i]);
    }

    st --;

    st *= p;
    dr *= p;

    for(int i = a; i <= st; i ++)
    {
        solution = max(solution, v[i]);
    }
    for(int i = b; i >= dr; i --)
    {
        solution = max(solution, v[i]);
    }

    return solution;
}

int main()
{

    fin.get(buf, BMAX, EOF);

    gint(N);
    gint(M);

    for(int i = 1; i <= N; i ++)
    {
        gint(v[i]);
    }

    p = (int)sqrt(N);

    for(int i = 1; i * p <= N; i ++)
    {
        interval[i].left = (i - 1) * p + 1;
        interval[i].right = i * p;

        for(int j = interval[i].left; j <= interval[i].right; j ++)
        {
            if(v[j] > A[i])
            {
                pozA[i] = j;
                A[i] = v[j];
            }
        }
    }

    while(M --)
    {
        gint(op);

        if(op)
        {
            gint(a), gint(b);
            update();
        }
        else
        {
            gint(a), gint(b);
            fout << query() << '\n';
        }

    }




    return 0;
}