Cod sursa(job #1708865)

Utilizator Vlad_317Vlad Panait Vlad_317 Data 28 mai 2016 01:15:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <stdio.h>

using namespace std;

const int MAX = (1 << 17) + 1;

int tree[2 * MAX + 10];
int n, m, sol = 0;

int max(int x, int y)
{
    if(x > y)
        return x;
    return y;
}

void update(int node, int left, int right, int pos, int val)
{
    if(left == right)
    {
        tree[node] = val;
        return;
    }

    int mid = (left + right) / 2;

    if(pos <= mid)
        update(2 * node, left, mid, pos, val);
    else
        update(2 * node + 1, mid + 1, right, pos, val);
    tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}

void querry(int node, int left, int right, int a, int b)
{
    if(a <= left && right <= b)
    {
        sol = max(sol, tree[node]);
        return;
    }

    int mid = (left + right) / 2;

    if(a <= mid)
        querry(2 * node, left, mid, a, b);
    if(b > mid)
        querry(2 * node + 1, mid + 1, right, a, b);
}

int main()
{
    FILE *fin, *fout;

    fin = fopen("arbint.in", "r");
    fout = fopen("arbint.out", "w");

    fscanf(fin, "%d%d", &n, &m);

    for(int i = 1; i <= n; i++)
    {
        int x;
        fscanf(fin, "%d", &x);
        update(1, 1, n, i, x);
    }

    for(int i = 1; i <= m; i++)
    {
        int op, x, y;
        fscanf(fin, "%d%d%d", &op, &x, &y);
        if(op == 0)
        {
            sol = 0;
            querry(1, 1, n, x, y);
            fprintf(fout, "%d\n", sol);
        }
        else
        {
            update(1, 1, n, x, y);
        }
    }

    return 0;
}