Cod sursa(job #869328)

Utilizator TeOOOVoina Teodora TeOOO Data 1 februarie 2013 13:59:27
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <stdio.h>
#include <algorithm>
using namespace std;

//Define
#define leftSon 2*node
#define rightSon 2*node+1

//Constante
const int sz=(int)4e5+1;

//Functii
void update(int node, int left, int right);
void query(int node, int left, int right);

//Variabile
FILE *in,*out;

int num, operations;
int position, value;
int leftLimit, rightLimit;
int tree[sz];

int main()
{
    in=fopen("arbint.in","rt");
    out=fopen("arbint.out","wt");

    fscanf(in,"%d%d",&num,&operations);

    for(position=1 ; position <= num ; ++position)
    {
        fscanf(in,"%d", &value);
        update(1, 1, num);
    }
    while(operations--)
    {
        int type;
        fscanf(in,"%d", &type);
        if(type)
        {
            fscanf(in,"%d%d", &position, &value);
            update(1, 1, num);
        }
        else
        {
            fscanf(in,"%d%d",&leftLimit, &rightLimit);
            value = 0;
            query(1, 1, num);
            fprintf(out,"%d\n", value);
        }
    }

    fclose(in);
    fclose(out);
    return 0;
}

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

    int mid = (left + right) / 2;

    if(position<=mid)
        update(leftSon, left, mid);
    else
        update(rightSon, mid+1, right);
    tree[node] = max( tree[leftSon], tree[rightSon]);
}

void query(int node, int left, int right)
{
    if(leftLimit <= left && right <= rightLimit)
    {
        value = max(value, tree[node]);
        return;
    }
    int mid= (left + right) / 2;

    if(leftLimit <= mid)
        query(leftSon, left, mid);
    if(mid < rightLimit)
        query(rightSon, mid+1, right);
}