Pagini recente » Cod sursa (job #2132244) | Cod sursa (job #1190720) | Cod sursa (job #2153974) | Cod sursa (job #1839858) | Cod sursa (job #3211618)
#include <bits/stdc++.h>
#define ll long long
//#define fin cin
//#define fout cout
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int v[100005];
struct aint
{
int st, dr, val;
aint *left, *right;
} *root;
void init_arbint (int st, int dr, aint *nod)
{
nod->st=st; nod->dr=dr; nod->val=-1;
//cout<<st<<' '<<dr<<endl;
if (st==dr) return;
nod->left=new aint; nod->right=new aint;
int mid=(st+dr)/2;
init_arbint(st, mid, nod->left); init_arbint(mid+1, dr, nod->right);
}
void set_value (int index, aint *nod, int val)
{
int st=nod->st, dr=nod->dr;
if (st==dr) {
nod->val=val;
return;
}
int mid=(st+dr)/2;
if (index<=mid) set_value(index, nod->left, val);
else set_value(index, nod->right, val);
nod->val=max(nod->left->val, nod->right->val);
}
/*
1 5
1 3 4 5
1 2 3
*/
int query(int a, int b, aint *nod)
{
//st a b dr
//a st b dr
//st a dr b
//a st dr b Imposibil?
if (nod==NULL) {
cout<<a<<' '<<b<<endl;
cout<<"Nod null"<<endl;
return -1;
}
//cout<<"Apel"<<endl;
int st=nod->st, dr=nod->dr;
int mid=(st+dr)/2;
int rez1=-1, rez2=-1;
//if (st==dr) return nod->val;
if (a<=st&&b>=dr) return nod->val; //st a mid b dr
if (a<=mid) {
rez1=query(a, b, nod->left);
if (rez1==-1) cout<<"Rez 1: "<<st<<' '<<dr<<' '<<a<<' '<<b<<endl;
}
if (b>mid) {
rez2=query(a, b, nod->right);
if (rez2==-1) cout<<"Rez 2: "<<st<<' '<<dr<<' '<<a<<' '<<b<<endl;
}
return max(rez1, rez2);
}
int main()
{
fin.tie(0); fin.sync_with_stdio(false);
int n, m; fin>>n>>m;
root=new aint;
init_arbint(1, n, root);
for (int i=1; i<=n; i++) {
fin>>v[i];
set_value(i, root, v[i]);
}
for (int i=1; i<=m; i++) {
int c, a, b;
fin>>c>>a>>b;
if (c==0) {
fout<<query(a, b, root)<<'\n';
}
if (c==1) {
set_value(a, root, b);
}
}
return 0;
}