Cod sursa(job #153674)

Utilizator cretuMusina Rares cretu Data 10 martie 2008 17:55:02
Problema Arbori de intervale Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#define MAX 100001
#define maxi(a, b) ((a) > (b) ? (a) : (b))

using namespace std;

int s[2*MAX+1], maxim, n, m;

void Update(int nod, int st, int dr, int p, int v);
void Querry(int nod, int st, int dr, int a, int b);

int main()
{
    int i, op, x1, x2;
    
    FILE * fin = fopen("arbint.in", "r");    
    FILE * fout = fopen("arbint.out", "w");
    
    fscanf(fin, "%d %d", &n, &m);
    
    for (i = 1; i <= n; i++)
    {
        fscanf(fin, "%d", &x1);
        Update(1, 1, n, i, x1);
    }
    
    int q;
    for (q = 1; q <= m; q++)
    {
        fscanf(fin, "%d %d %d", &op, &x1, &x2); 
        if (op == 0)   
        {
             maxim = 0;
             Querry(1, 1, n, x1, x2);
             fprintf(fout, "%d\n", maxim);      
        }
        else Update(1, 1, n, x1, x2);
    }
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}

void Update(int nod, int st, int dr, int p, int v)
{
    if (st == dr)
    {
        s[nod] = v;
        return;       
    } 
    
    int mijl = (st+dr)/2;
    
    if (p <= mijl) Update(2*nod, st, mijl, p, v);
    if (mijl < p) Update(2*nod+1, mijl+1, dr, p, v);
    
    s[nod] = maxi(s[2*nod], s[2*nod+1]);
}

void Querry(int nod, int st, int dr, int a, int b)
{
     if (a <= st && dr <= b)     
     {
         maxim = maxi(maxim, s[nod]);
         return;      
     }
     
     int mijl = (st+dr)/2;
     if (a <= mijl) Querry(2*nod, st, mijl, a, b);
     if (b > mijl) Querry(2*nod+1, mijl+1, dr, a, b);
}