Cod sursa(job #1568982)

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

#define BMAX 100010 * 5
#define DIM 100010

using namespace std;

//ifstream fin("arbint.in");
//ofstream fout("arbint.out");
FILE *f,*g;

int p, N, M, a, b, op, buffer, v[DIM], A[320], i, j, st, dr, c, d;
char buf[BMAX];
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 == 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(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] = max(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 = max(solution, A[i]);
            dr = max(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 = max(solution, v[i]);
    }
    for(i = d; i <= b; i ++)
    {
        solution = max(solution, v[i]);
    }
}

int main()
{

    f=fopen("arbint.in","r");
    g=fopen("arbint.out","w");

    //fin.get(buf, BMAX, EOF);

    //gint(N);
    //gint(M);

     fscanf(f,"%d%d",&N,&M);

    for(int i = 1; i <= N; i ++)
    {
        //gint(v[i]);
        fscanf(f,"%d",&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] = max(A[i], v[j]);
        }
    }

    while(M --)
    {
        //gint(op);
        fscanf(f,"%d%d%d",&op,&a,&b);

        if(op)
        {
          //  gint(a), gint(b);
            update();
        }
        else
        {
            //gint(a), gint(b);
            solution = 0;
            query();
            //fout << solution << '\n';
            fprintf(g,"%d\n",solution);
        }

    }




    return 0;
}