Cod sursa(job #1568945)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 14 ianuarie 2016 21:07:02
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.82 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;
    int solution = 0;
    int c = N + 1; int d = 0;

    for(int i = 1; i <= N / p + 1; i ++)
    {
        if( a <= interval[i].left && interval[i].right <= b)
        {
            solution = max(solution, A[i]);
            dr = max(dr, interval[i].right);
            if(interval[i].left < st)
            {
                st = interval[i].left;
            }
        }
    }
    if(c == N + 1 && d == 0)
    {
        c = d = b;
    }

    for(int i = a; i <= c; i ++){
        solution = max(solution, v[i]);
    }
    for(int i = d; i <= b; 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;
}