Cod sursa(job #1568988)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 14 ianuarie 2016 21:32:51
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include <fstream>
#include <cmath>
#include <cstring>

#define Bmaxim 100010 * 5
#define DIM 100010

using namespace std;

int maxim(const int &a, const int &b)
{
    if (a > b)
        return a;
    return b;
}

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

int p, N, M, a, b, op, buffer, v[DIM], A[320], i, j, st, dr, c, d;
char buf[Bmaxim];
int solution;
int int_st[320];
int int_dr[320];

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

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

    for(i = 1; i * p <= N;i ++){
        if( int_st[i] <= a && int_dr[i] >= a )
            {
            A[i] = 0;
            for(j = int_st[i]; j <= int_dr[i]; j ++){
                A[i] = maxim(A[i],v[j]);
            }
            break;
        }
    }

}

void query()
{
    c = N + 1; d = 0;

    for(i = 1; i <= N / p + 1; i ++)
    {
        if( a <= int_st[i] && int_dr[i] <= b)
        {
            solution = maxim(solution, A[i]);
            dr = maxim(dr, int_dr[i]);
            if(int_st[i] < st)
            {
                st = int_st[i];
            }
        }
    }
    if(c == N + 1 && d == 0)
    {
        c = d = b;
    }

    for(i = a; i <= c; i ++)
        {
        solution = maxim(solution, v[i]);
    }
    for(i = d; i <= b; i ++)
    {
        solution = maxim(solution, v[i]);
    }
}

int main()
{

    fin.get(buf, Bmaxim, EOF);

    gint(N);
    gint(M);

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

    p = (int)sqrt(N);

    for(i = 1; i * p <= N; i ++)
    {
        int_st[i] = (i - 1) * p + 1;
        int_dr[i] = i * p;

        for(j = int_st[i]; j <= int_dr[i]; j ++)
        {
            A[i] = maxim(A[i], v[j]);
        }
    }

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

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

    }




    return 0;
}