Cod sursa(job #1482964)

Utilizator dr_personalityEftime Andrei Horatiu dr_personality Data 8 septembrie 2015 13:45:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");

const int nmax = 100006;
int n, m, ai[4 * nmax], upoz, rasp;

void update(int st, int dr, int poz, int x)
{
    int mid;

    if(st==dr)
	{
        ai[poz] = x;
        return ;
    }

    mid = (st + dr) / 2;
    if(mid<upoz) 
	{
        update(mid + 1, dr, 2 * poz + 1, x);
    } 
	else
	{
        update(st, mid, 2 * poz, x);
    }

    ai[poz] = max(ai[2 * poz], ai[2 * poz + 1]);
}

void query(int stp, int drp, int st, int dr, int poz)
{
    if(stp<=st && dr<=drp)
	{
        rasp = max(rasp, ai[poz]);
        return ;
    }

    int mid = (st + dr) / 2;
    if(mid>=stp) 
	{
        query( stp, drp, st, mid, 2 * poz );
    }
    if (mid + 1<=drp) 
	{
        query( stp, drp, mid + 1, dr, 2 * poz + 1 );
    }
}

int main(){
	int player_unu=0;

	in>>n>>m;
	for(int i = 1; i<=n; i++)
	{
		int x;
		in>>x;

		upoz = i;
		update(1, n, 1, x);
	}

	for(int i = 1; i<=m; i++)
	{
		int op, a, b;
		in>>op>>a>>b;

		if(op==1)
		{
			upoz = a;
			update(1, n, 1, b);
		}
		else
		{
			rasp = 0;
			query(a, b, 1, n, 1);

			out<<rasp<<'\n';
		}
	}

	return player_unu;
}