Cod sursa(job #1197161)

Utilizator ariel_roAriel Chelsau ariel_ro Data 10 iunie 2014 22:01:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define NX 100005
#define NXARB 262144

int t[NXARB], A, B;

inline int MaximTwoElems(int a, int b) {
       if (a > b) 
           return a;
       return b;
}

int createArbInt(int nod, int st, int dr, int val)
{
	if (st == dr)
	{
		t[nod] = val;
		return t[nod];
	}
	else 
	{
		int mij = (st + dr) >> 1;
		int val1 = t[nod << 1], val2 = t[(nod << 1) + 1];
		if (A <= mij)
		{
			val1 = createArbInt(nod << 1, st, mij, val);
		} 
		
		if (B > mij)
		{
			val2 = createArbInt((nod << 1) + 1, mij + 1, dr, val);
		}
		t[nod] = MaximTwoElems(val1, val2);
		return t[nod];
	}
}

int query(int nod, int st, int dr)
{
	if (A <= st && dr <= B)
	{
		return t[nod];
	}
	else 
	{
		int mij = (st + dr) >> 1;
		int val1 = 0, val2 = 0;
		if (A <= mij)
		{
			val1 = query(nod << 1, st, mij);
		}
		
		if (B > mij)
		{
			val2 = query((nod << 1) + 1, mij + 1, dr);
		}
		return MaximTwoElems(val1, val2);
	}
}

int main()
{
    int N, M, op, an, bn, val;
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
 
	scanf("%d %d", &N, &M);
  
	for (int i = 1; i <= N; i++)
	{
		scanf("%d", &val);
		A = i; B = i;
		createArbInt(1, 1, N, val);
	}

    for (int i = 1; i <= M; i++)
    {
        scanf("%d %d %d\n", &op, &an, &bn);
  
        switch (op)
        {
        case 0:
			A = an;
			B = bn;
            printf("%d\n", query(1, 1, N));
            break;
        case 1:
			A = an;
			B = an;
			createArbInt(1, 1, N, bn);
             
            break;
        }
    }

}