Cod sursa(job #3144871)

Utilizator rainerretzler rainer Data 11 august 2023 01:43:18
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.88 kb
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<climits>
#include<fstream>

using namespace std;



class node{
	int pozStart, pozStop, mijloc, max;
	node *left, *right;

public:


	int getMax(int intervalStart, int intervalStop){

		//pSa=pozStart
		//pSo=pozStop
		//iSa=intervalStart
		//iSo=intervalStop

		if(pozStop<intervalStart || pozStart>intervalStop){ //(1)
			return INT_MIN;
		}

		if(pozStart==pozStop){ //(2)
			return max;
		}

		if(pozStart>=intervalStart && pozStop<=intervalStop){ //(3)
			return max;
		}

		if(pozStart<=intervalStart){
			//pSa<=iSa
			if(intervalStart<=pozStop){
				//pSa<=iSa<=pSo
				if(pozStop<=intervalStop){
					//pSa<=iSa<=pSo<=iSo
					int le=left->getMax(intervalStart,mijloc);
					int ri=right->getMax(intervalStart,pozStop);
					return (le>ri?le:ri);
				}
				else{
					//pSa<=iSa<=iSo<pSo
					//aici
					int le=left->getMax(intervalStart,intervalStop);
					int ri=right->getMax(intervalStart,intervalStop);
					return (le>ri?le:ri);
				}
			}
			else{
				//pSo<iSa, vezi caz 1
			}
		}
		else{
			//iSa<pSa
			if(intervalStop<pozStart){
				//iSo<pSa, vezi caz 1
			}
			else{
				//iSa<pSa si pSa<=iSo
				if(pozStop<=intervalStop){
					//iSa<pSa<=pSo<=iSo, vezi caz 3
				}
				else{
					//iSa<pSa si iSo<pSo
					if(intervalStop<pozStart){
						//iSo<pSa, vezi caz 1
					}
					else{
						//iSa<pSa<=iSo<pSo
						int le=left->getMax(pozStart,intervalStop);
						int ri=right->getMax(mijloc+1,intervalStop);
						return (le>ri?le:ri);
					}
				}
			}
		}
		return 0;
	}


	void update(int poz, int val){
		if(poz<pozStart||poz>pozStop){
			return;
		}
		if(left!=NULL){
			left->update(poz, val);
			right->update(poz, val);
			int maxLeft=left->getMax();
			int maxRight=right->getMax();
			max=(maxLeft>=maxRight?maxLeft:maxRight);
			return;
		}
		max=val;
	}

	node(int _pozStart, int _pozStop, vector<int>& v){
		pozStop=_pozStop;
		pozStart=_pozStart;
		if(pozStart==pozStop){
			max=v[pozStop];
			left=NULL;
			right=NULL;
		}
		else{
			mijloc=(pozStart+pozStop)/2;
			left=new node(pozStart,mijloc,v);
			right=new node(mijloc+1, pozStop,v);
			int maxLeft=left->getMax();
			int maxRight=right->getMax();
			max=(maxLeft>=maxRight?maxLeft:maxRight);
		}
	}

	int getMax(){
		return max;
	}

	void toString(int t){
		for(int i=0;i<t;i++){
			cout<<"\t";
		}
		cout<<"node: "<<pozStart<<" "<<pozStop<<" "<<max<<"\n";
		if(left!=NULL){
			left->toString(t+1);
			right->toString(t+1);
		}
	}

};

int main(){


	ifstream fin("arbint.in");
	ofstream fout("arbout.out");
	int n,m;
	fin>>n>>m;
	vector<int> v(n);
	for(int i=0;i<n;i++){
		fin>>v[i];
	}

	node* root=new node(0,n-1,v);
	// root->toString(0);


	for(int i=0;i<m;i++){
		int a,b,c;
		fin>>a>>b>>c;
		if(a==1){
			root->update(b-1,c);
			// cout<<"\n\n\n";
			// root->toString(0);
		}
		else{
			int m=root->getMax(b-1,c-1);
			fout<<m<<"\n";
			cout<<"\n";
		}
	}




	return 0;
}