Pagini recente » Cod sursa (job #2776173) | Cod sursa (job #1820828) | Cod sursa (job #859313) | Cod sursa (job #1568586) | Cod sursa (job #3144871)
#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;
}