Cod sursa(job #2304368)

Utilizator alexoloieriAlexandru Oloieri alexoloieri Data 17 decembrie 2018 22:28:06
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>
#include <algorithm>
#define LMAX 100005
#define INF 999999999

using namespace std;
FILE *fin=fopen("arbint.in", "r");
FILE *fout=fopen("arbint.out", "w");

int aib[4*LMAX];
int a[LMAX];
int n, m;
int tip, x, y;

void build(int nod, int st, int dr)
{
    if (st>dr)
    {
        return;
    }
    if (st == dr)
    {
        aib[nod] = a[st];
        return ;
    }
    int m = (st+dr)/2;
    build(nod<<1, st, m);
    build(nod<<1|1, m+1, dr);
    aib[nod] = max(aib[nod<<1], aib[nod<<1|1]);
}

void update(int nod, int st, int dr, int x, int y)
{
    if (st == dr)
    {
        aib[nod] = y;
        return ;
    }
    int m = (st+dr)/2;
    if (x<=m)
    {
        update(nod<<1, st, m, x, y);
    }
    else
    {
        update(nod<<1|1, m+1, dr, x, y);
    }
    aib[nod] = max(aib[nod<<1], aib[nod<<1|1]);
}

int query(int nod, int st, int dr, int x, int y)
{
    if (x<=st&&dr<=y)
    {
        return aib[nod];
    }
    int ret = -INF;
    int m = (st+dr)/2;
    int v1 = -1, v2 = -1;
    if (x<=m)
    {
        v1 = query(nod<<1, st, m, x, y);
    }
    if (y>m)
    {
        v2 = query(nod<<1|1, m+1, dr, x, y);
    }
    ret = max(ret, v1);
    ret = max(ret, v2);
    return ret;
}

int main()
{
    fscanf(fin, "%d %d",&n,&m);
    for (int i =1;i<=n;++i)
    {
        fscanf(fin, "%d",&a[i]);
    }
    build(1, 1, n);
    for (int i=1;i<=m;++i)
    {
        fscanf(fin,"%d %d %d",&tip, &x, &y);
        if (!tip)
        {
            fprintf(fout, "%d\n", query(1, 1, n, x, y));
        }
        else
        {
            update(1, 1, n, x, y);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}