Cod sursa(job #2419576)

Utilizator rainerretzler rainer Data 8 mai 2019 21:15:01
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.18 kb
// bril.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
//#include <fstream>
#include <cstdio>
#include <stdio.h>
using namespace std;

#define min(a,b) (a>b?b:a)
#define max(a,b) (a<b?b:a)


//ifstream fin("arbint.in");
//ofstream fout("arbint.out");

FILE *fin, *fout;








struct nod {
	int ma, left, right;
	//nod *leftNod, *rightNod;
};

nod noduri[300010];
int n, m;


void constr(int poz) {
	if (noduri[poz].left == noduri[poz].right) {
		//fin >> noduri[poz].ma;
		//fscanf_s(fin, "%d", &noduri[poz].ma);
		fscanf(fin, "%d", &noduri[poz].ma);

	}
	else {
		int mid = (noduri[poz].left + noduri[poz].right) / 2;
		noduri[2 * poz].left = noduri[poz].left;
		noduri[2 * poz].right = mid;
		noduri[2 * poz + 1].left = mid+1;
		noduri[2 * poz + 1].right = noduri[poz].right;
		
		constr(2*poz);
		constr(2 * poz+1);
		noduri[poz].ma = max(noduri[2 * poz].ma, noduri[2 * poz + 1].ma);
	}
}


void do1(int poz, int a, int b) {
	if (noduri[poz].left == a&&noduri[poz].right == a)
		noduri[poz].ma = b;
	else {
		int mid = (noduri[poz].left + noduri[poz].right) / 2;
		if (a <= mid)
			do1(2*poz, a, b);
		else
			do1(2*poz+1, a, b);
		noduri[poz].ma = max(noduri[2 * poz].ma, noduri[2 * poz + 1].ma);
	}
}

int do0(int poz, int a, int b) {
	if (noduri[poz].left == a&&noduri[poz].right == b)
		return noduri[poz].ma;
	int mid = (noduri[poz].left + noduri[poz].right) / 2;
	if (b <= mid)
		return do0(2*poz, a, b);
	if (a <= mid&&b > mid)
		return max(do0(2 * poz, a, mid), do0(2 * poz + 1,mid+1,b));
	if (a > mid)
		return do0(2 * poz+1, a, b);
	return 0;

}


int main()
{
	/*
	errno_t err;
	err = fopen_s(&fin, "arbint.in", "r");
	err = fopen_s(&fout, "arbint.out", "w");
	*/
	fin=fopen( "arbint.in", "r");
	fout=fopen("arbint.out", "w");
	//fin >> n >> m;
	fscanf(fin, "%d%d", &n,&m);
	noduri[1].left = 1;
	noduri[1].right = n;
	constr(1);
	int x, y, z;
	for (int i = 1; i <= m; ++i) {
		fscanf(fin, "%d%d%d", &x, &y,&z);
		if (x == 0)
			//fout << do0(1,y,z)<<"\n";
			fprintf(fout, "%d\n", do0(1, y, z));
		else
			do1(1, y, z);
	}
	fclose(fin);
	fclose(fout);
    return 0;
}