Cod sursa(job #1043709)

Utilizator Lucian-GeorgeFMI Popa Lucian George Lucian-George Data 28 noiembrie 2013 21:36:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<iostream>
#include<fstream>
#include<stdio.h>
using namespace std;
long arb[400501],a,b,maxim,val,v[100001],n,maxpoz=0;
long max(long a, long b)
{
	if (a<b) return b;
	else return a;
}

void update(int poz,int st,int dr, int a, int val)
{
	if (st==dr) {arb[poz]=val; return; }
	{
		int mij=(st+dr)/2;
		if (a<=mij) update(poz*2,st,mij,a,val);
		else update(poz*2+1,mij+1,dr,a,val);
		//arb[poz/2]=max(arb[poz],arb[poz+1]);
		arb[poz]=max(arb[2*poz],arb[2*poz+1]);
	}
	//arb[poz]=max(arb[poz*2],arb[poz*2+1]);
	
}

void verif(int poz,int st, int dr)
{
	if (a<=st && dr<=b) {if (arb[poz]>maxim) maxim=arb[poz]; return;}
	{
		int mij=(st+dr)/2;
		if (a<=mij) verif(2*poz,st,mij);
		if (b>mij) verif(2*poz+1,mij+1,dr);
	}
}
	

int main()
{
	int i,o,x,m;
	FILE *f,*g;
	f=fopen("arbint.in","r");
	g=fopen("arbint.out","w");
	fscanf(f,"%d",&n);
	fscanf(f,"%d",&m);
	for (i=1; i<=n; i++)
	{
		fscanf(f,"%d",&v[i]);
		update(1,1,n,i,v[i]);
	}
	for (i=1; i<=m; i++)
	{
		fscanf(f,"%d",&o);
		fscanf(f,"%d",&a);
		fscanf(f,"%d",&b);
		//f>>o>>a>>b;
		if (o==0)
		{
			maxim=0;
			verif(1,1,n);
			fprintf(g,"%d\n",maxim);
			//g<<maxim<<endl;
		}
		else update(1,1,n,a,b);
	}
	//for (i=1; i<=maxpoz; i++) cout<<arb[i]<<" ";
	return 0;
}