Cod sursa(job #1228698)

Utilizator somuBanil Ardej somu Data 14 septembrie 2014 23:12:00
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>
using namespace std;

typedef struct element {
    int value, st, dr;
} ELEMENT;

#define nmax 2*100001+1
ifstream fi("arbint.in");
ofstream fo("arbint.out");

int N, M;
int A[nmax];
ELEMENT H[nmax];

int lenH, i;
int tip, val, poz, st, dr;

void initialize()
{
    lenH = 1;
    while (lenH < N)
        lenH <<= 1;
    
    for (i = lenH; i <= 2 * lenH - 1; i++)
    {
        H[i].value = A[i - lenH + 1];
        H[i].st = H[i].dr = i - lenH + 1;
    }
    
    for (i = 2 * lenH - 1; i > 1; i--)
    {
        if (H[i>>1].value < H[i].value)
            H[i>>1].value = H[i].value;
        H[i>>1].st = H[i].st;
        H[i>>1].dr = H[i+1].dr;
    }
     
}

void update(int val, int poz)
{
    poz = poz + lenH - 1;
    H[poz].value = val;
    while ((poz>>1) > 0)
    {
        poz >>= 1;
        H[poz].value  = max(H[poz<<1].value, H[(poz<<1)+1].value);
    }
}

int query(int nod, int st, int dr)
{
    
    if (H[nod].st > dr)
        return 0;
    
    if (H[nod].dr < st)
        return 0;
    
    if (st <= H[nod].st && H[nod].dr <= dr)
        return H[nod].value;
    
    int stP = query(nod*2, st, dr);
    int drP = query(nod*2+1, st, dr);
    
    return max(stP, drP);
}

void citire()
{
    fi >> N >> M;
    
    for (i = 1; i <= N; i++)
        fi >> A[i];
    
    initialize();
    
    for (i = 1; i <= M; i++)
    {
        fi >> tip;
        
        if (tip == 0)
        {
            fi >> st >> dr;
            fo << query(1, st, dr) << "\n";
        }
        else
        {
            fi >> poz >> val;
            update(val, poz);
        }
    }
}

int main()
{

    citire();
    
    fi.close();
    fo.close();
    
    return 0;
}