Cod sursa(job #793730)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 3 octombrie 2012 21:36:33
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <iostream>
#define mx(x,y) x>y?x:y;

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int n,m,a[400010], poz, val;

void modify(int, int ,int);
int interogate(int, int, int, int, int);

int main()
{
	f >> n >> m;
	for(poz=1; poz<=n; ++poz)
	{
		f >> val;
		modify(1, 1, n);
	}
	for(int i=1; i<=m; ++i)
	{
		f >> a[0] >> poz >> val;
		if(a[0])
		{
			modify(1, 1, n);
		}
		else
		{
			g << interogate(1, poz, val, 1, n) << '\n';
		}
	}
}

void modify(int cur, int st, int dr)
{
    int m = (dr + st)>>1;
    if(dr == st)
    {
        a[cur] = val;
    }
    else
    {
        if(poz<=m)
        {
            modify(2*cur, st, m);
        }
        else
        {
            modify(2*cur+1, m+1, dr);
        }
        a[cur] = mx(a[cur*2], a[cur*2+1]);
    }
}

int interogate(int cur, int s, int d, int st, int dr)
{
	if(s == st && d == dr)
	{
		return a[cur];
	}
	else
	{
		int m = (st + dr) >> 1;
		if(s <= m)
		{
			if(d > m)
			{
				int a = interogate(2 * cur, s, m, st, m), b = interogate(2 * cur + 1, m + 1, d, m+1, dr);
				return mx(a,b);
			}
			else
			{
				return interogate(2 * cur, s, d, st, m);
			}
		}
		else
		{
			return interogate(2 * cur + 1, s, d, m+1, dr);
		}
	}
}