Cod sursa(job #2628575)

Utilizator RaduQQTCucuta Radu RaduQQT Data 16 iunie 2020 14:07:39
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>



int v[100001];
int n, m;

typedef struct tree
{
	int max;
	tree* left;
	tree* right;
};

int maxim(int a, int b)
{
	if (a > b)
		return a;
	else
		return b;
}
void createTree(tree*& node,int l,int r)
{
	if (l == r)
	{
		node->max = v[l];
		node->left = NULL;
		node->right = NULL;
		return;
	}

	tree* left = (tree*)malloc(sizeof(tree));
	tree* right = (tree*)malloc(sizeof(tree));
	node->left = left;
	node->right = right;

	int div = (l + r) / 2;
	createTree(node->left, l, div);
	createTree(node->right, div + 1, r);
	
	if(node->left!=NULL)
	  node->max = maxim(node->left->max, node->right->max);
}

int val,pos;
void update(tree*& node, int l, int r)
{
	if (pos == l && pos == r)
	{
		node->max = val;
		return;
	}
	int div = (l + r) / 2;
	if (pos <= div)
		update(node->left, l, div);
	else
		update(node->right, div + 1, r);

	node->max = maxim(node->left->max, node->right->max);
}

int start, finish,max;
void query(tree* node, int l, int r)
{
	
	if (l >= start && r <= finish)
	{
		if (max < node->max)
			max = node->max;
		return;
	}
	if (l == r)
		return;

	int div = (l + r) / 2;
	if(start<=div)
	      query(node->left, l, div);
	if (finish > div)
		query(node->right, div + 1, r);
}
int main()
{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	scanf("%d%d", &n, &m);

	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &v[i]);
	}

	tree* head = (tree*)malloc(sizeof(tree));
	createTree(head, 1, n);

	int x,a,b;
	for (int i = 1; i <= m; i++)
	{
		scanf("%d%d%d", &x,&a,&b);
		if (x)
		{
			val = b;
			pos = a;
			update(head, 1, n);
		}
		else
		{
			max = 0;
			start = a;
			finish = b;
			query(head, 1, n);
			printf("%d\n", max);
		}
	}

}