Cod sursa(job #679523)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 13 februarie 2012 13:32:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream>
#include<iostream>

using namespace std;

int v[100005],a[400100],n,m;

void init (int k, int st , int dr ) 
{
	if (st==dr){
		a[k]=v[st];return ;}
	int mij=(st+dr)/2;
	init(k*2,st,mij);
	init(k*2+1,mij+1,dr);
	a[k]=max(a[k*2],a[k*2+1]);
}

int query (int k, int st, int dr, int l, int d )
{
	if (st>d) return 0;
	if (dr<l) return 0;
	if (l<=st && dr<=d) return a[k];
	
	int mij=(st+dr)/2;
	return max (query(k*2,st,mij,l,d),query(k*2+1,mij+1,dr,l,d));
}
		
void update (int k, int st, int dr, int poz )
{
	if (st==dr) {a[k]=v[st] ; return;}
	
	int mij=(st+dr)/2;
	if (mij>=poz)
		update(k*2,st,mij,poz);
	else 
		update (k*2+1,mij+1,dr, poz);
	a[k]=max (a[k*2],a[k*2+1]);
}

void citire (FILE *f)
{
	int i;
	fscanf (f,"%d%d",&n,&m);
	for (i=1;i<=n;i++)
		fscanf (f,"%d",&v[i]);
}

void solve (FILE *f)
{
	int i,tip,x,y,j;
	FILE *g=fopen("arbint.out","w");
	for (i=1;i<=m;i++)
	{
		fscanf (f,"%d%d%d",&tip,&x,&y);
		switch (tip) 
		{
			case 0 : { fprintf( g,"%d\n",query(1,1,n,x,y)); break; }
			case 1 : { v[x]=y; update (1,1,n,x); } 
		}
	}
	fclose(g);
}
int main()
{
	FILE *f=fopen ("arbint.in","r");
	citire(f);
	init(1,1,n);
	solve(f);
	fclose(f);
	return 0;
}