Cod sursa(job #2648631)

Utilizator rainerretzler rainer Data 12 septembrie 2020 03:47:25
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include<iostream>
#include<cstdio>
#include<vector>
#include<fstream>

using namespace std;

struct node{
	int a,b,v;
	node *l=NULL,*r=NULL;
};

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

node *root;

node* constr(int l, int r, vector<int>& v){
	node *n=new node();
	n->a=l;
	n->b=r;
	if(r-l==0){
		n->v=v[l-1];
	}
	else{
		int m=(l+r)/2;
		n->l=constr(l,m,v);
		n->r=constr(m+1,r,v);
		n->v=max(n->l->v,n->r->v);
	}
	return n;
}


void setV(int poz, int v, node *n){
	//cout<<"sv: "<<poz<<" "<<v<<" "<<n->a<<" "<<n->b<<"\n";
	if(n->a==poz&&n->b==poz){
		n->v=v;
	}
	else{
		int m=(n->a+n->b)/2;
		if(poz<=m){
			setV(poz,v,n->l);
		}
		else{
			setV(poz,v,n->r);	
		}
		int a=n->l->v,b=n->r->v;
		n->v=max(a,b);
	}
}

int getM(node *n, int l, int r){
	//cout<<n->a<<" "<<n->b<<" "<<l<<" "<<r<<"\n";
	if(l<=n->a&&r>=n->b){
		return n->v;
	}
	if(l>n->b||r<n->a){
		return 0;
	}
	int a=getM(n->l,l,r),b=getM(n->r,l,r);
	return max(a,b);
}

void show(node *n, int l){
	if(n==NULL){
		return;
	}
	for(int i=0;i<l;++i){
		cout<<"\t";
	}
	cout<<n->a<<" "<<n->b<<" "<<n->v<<"\n";
	show(n->l,l+1);
	show(n->r,l+1);
}

int main(){
	int n,m;
	fin>>n>>m;
	vector<int> v(n);
	for(int i=0;i<n;++i){
		//scanf("%d",&(v[i]));
		fin>>v[i];
	}
	root=constr(1,n,v);
	//show(root,0);
	int x,y,z;
	for(int i=0;i<m;++i){
		//scanf("%d%d%d",&x,&y,&z);
		fin>>x>>y>>z;
		if(x==0){
			//printf("%d\n",getM(root,y,z));
			fout<<getM(root,y,z)<<"\n";
			//cout<<"\n";
		}
		else{
			setV(y,z,root);
			//show(root,0);
		}
	}
	fin.close();
	fout.close();
	return 0;
}