Cod sursa(job #1568966)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 14 ianuarie 2016 21:21:36
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.55 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];
int solution;
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;

    for(int i = 1; i * p <= N;i ++){
        if( interval[i].left <= a && interval[i].right >= a )
            {
            A[i] = 0;
            for(int j = interval[i].left; j <= interval[i].right; j ++){
                A[i] = max(A[i],v[j]);
            }
            break;
        }
    }

}

void query()
{
    int st, dr;
    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]);
    }
}

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);
            solution = 0;
            query();
            fout << solution << '\n';
        }

    }




    return 0;
}