Cod sursa(job #2034197)

Utilizator Coroian_DavidCoroian David Coroian_David Data 7 octombrie 2017 16:25:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>

#define MAX_N 100000

using namespace std;

FILE *f, *g;

int a, b;

int mx[MAX_N * 4 + 1];
int v[MAX_N + 1];

void buildArb(int poz, int st, int dr)
{
    if(st == dr)
    {
        mx[poz] = v[st];

        return;
    }

    int mid = (st + dr) / 2;

    buildArb(2 * poz, st, mid);
    buildArb(2 * poz + 1, mid + 1, dr);

    mx[poz] = max(mx[poz * 2], mx[poz * 2 + 1]);
}

void update(int poz, int st, int dr)
{
    if(st == dr)
    {
        v[st] = b;
        mx[poz] = v[st];

        return;
    }

    int mid = (st + dr) / 2;

    if(a >= st && a <= mid)
        update(poz * 2, st, mid);

    else
        if(a > mid && a <= dr)
            update(poz * 2 + 1, mid + 1, dr);

    mx[poz] = max(mx[poz * 2], mx[poz * 2 + 1]);
}

int getMax(int poz, int st, int dr, int a, int b)
{
    if(st == dr)
        return mx[poz];

    if(st == a && dr == b)
        return mx[poz];

    int mid = (st + dr) / 2;

    if(b <= mid)
        return getMax(poz * 2, st, mid, a, b);

    if(b > mid)
    {
        if(a > mid)
            return getMax(poz * 2 + 1, mid + 1, dr, a, b);

        else
            return max(getMax(poz * 2, st, mid, a, mid), getMax(poz * 2 + 1, mid + 1, dr, mid + 1, b));
    }

    return 0;
}

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

    int n, m;
    fscanf(f, "%d%d", &n, &m);

    int i;
    for(i = 1; i <= n; i ++)
        fscanf(f, "%d", &v[i]);

    buildArb(1, 1, n);

    int type;
    while(m > 0)
    {
        fscanf(f, "%d%d%d", &type, &a, &b);

        if(type == 1)
            update(1, 1, n);

        else
            if(type == 0)
                fprintf(g, "%d\n", getMax(1, 1, n, a, b));

        m --;
    }

    fclose(f);
    fclose(g);
}

int main()
{
    ansQues();

    return 0;
}