Mai intai trebuie sa te autentifici.
Cod sursa(job #2387641)
Utilizator | Data | 24 martie 2019 22:39:45 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.26 kb |
#include <bits/stdc++.h>
#define DMAX 300010
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a[DMAX];
int n,m;
inline int maxim(int x, int y)
{
return x>y ? x : y;
}
void citire();
int query(int nod,int st,int dr, int x, int y);
void Modif(int val, int poz, int st, int dr, int nod);
int main()
{citire();
return 0;
}
void citire()
{
int i;
int x,y,c;
fin>>n>>m;
for(i=1;i<=n;i++)
{
fin>>x;
Modif(x,i,1,n,1);
}
for(i=1;i<=m;i++)
{
fin>>c>>x>>y;
if(c==1)
Modif(y,x,1,n,1);
else
fout<< query(1,1,n,x,y)<<'\n';
}
}
void Modif(int val,int poz,int st, int dr,int nod)
{
int mj;
if(st==dr)
a[nod]=val;
else
{
mj=(st+dr)/2;
if(poz<=mj)
Modif(val,poz,st,mj,2*nod);
else
Modif(val,poz,mj+1,dr,2*nod+1);
a[nod]=maxim(a[nod*2],a[nod*2+1]);
}
}
int query(int nod, int st, int dr, int x, int y)
{int mj;
int ans1=0,ans2=0;
if(x<=st && y>=dr)
return a[nod];
mj=(st+dr)/2;
if(x<=mj)
ans1= query(2*nod,st,mj,x,y);
if(y>mj)
ans2= query(2*nod+1,mj+1,dr,x,y);
return maxim(ans1,ans2);
}