Pagini recente » Cod sursa (job #894206) | Cod sursa (job #707209) | Cod sursa (job #1658000) | Cod sursa (job #909895) | Cod sursa (job #759159)
Cod sursa(job #759159)
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <limits.h>
#define NMAX 100010
using namespace std;
typedef struct node{
int a,b;
int val;
node *left,*right;
}node;
void insert(int x, int val,node *T)
{
if (x<=T->a && x>= T->b)
{
T->val = val;
return;
}
int mij = (T->a+T->b)/2;
if (x<=mij)
insert(x,val,T->left);
if (x>mij)
insert(x,val,T->right);
int mx = T->left->val;
if (mx>T->right->val)
T->val = mx;
else
T->val = T->right->val;
}
int getmax(int a, int b,node *T)
{
if (a<=T->a && b>=T->b)
{
return T->val;
}
int m1=INT_MIN;
int m2=INT_MIN;
int mij = (T->a+T->b)/2;
if(a<=mij)
m1 = getmax(a,b,T->left);
if (b>mij)
m2 = getmax(a,b,T->right);
if (m1>m2) return m1;
return m2;
}
node* buildtree(int a,int b,int *val)
{
if (a==b)
{
node *x= new node;
x->a = a;
x->b = b;
x->val = val[a];
x->left = NULL;
x->right = NULL;
return x;
}
else{
int mij = (a+b)/2;
node *x = new node;
x->a =a;
x->b =b;
x->left = buildtree(a,mij,val);
x->right = buildtree(mij+1,b, val);
int max = x->left->val;
if (x->right->val>max)
max = x->right->val;
x->val = max;
return x;
}
return NULL;
}
int vect[NMAX];
node *T;
int main()
{
ifstream f("arbint.in",ios::in);
ofstream g("arbint.out",ios::out);
int n,m;
f>>n>>m;
for (int i=0;i<n;i++)
f>>vect[i];
T = buildtree(0,n-1,vect);
for (int j=0;j<m;j++)
{
int t,a,b,mx;
f>>t>>a>>b;
if (t==0){
mx = getmax(a-1,b-1,T);
g<<mx<<"\n";
}
else{
vect[a-1] = b;
insert(a-1,b,T);
}
}
f.close();
g.close();
}