Pagini recente » Cod sursa (job #2500952) | Cod sursa (job #2365320) | Cod sursa (job #1759415) | Cod sursa (job #951886) | Cod sursa (job #2052963)
#include<fstream>
#include<iostream>
#include<vector>
#define DN 200005
#define x first
#define y second
#include<queue>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a[DN],pr[DN],n,m,y,c[DN],nod,mij,r[DN];
pair<int,int>x[DN];
vector<int>v[DN];
queue<int >q;
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>a[i];
y=1;
x[1].x=1;
x[1].y=n;
q.push(1);
while(!q.empty())
{
nod=q.front();
q.pop();
if(x[nod].x!=x[nod].y)
{
mij=(x[nod].x+x[nod].y)/2;
y++;
x[y].x=x[nod].x;
x[y].y=mij;
pr[y]=nod;
q.push(y);
v[nod].push_back(y);
y++;
x[y].x=mij+1;
x[y].y=x[nod].y;
pr[y]=nod;
q.push(y);
v[nod].push_back(y);
}
else
c[x[nod].x]=nod;
}
for(int i=1;i<=n;i++)
{
nod=c[i];
r[nod]=a[i];
}
for(int i=1;i<=n;i++)
{
nod=c[i];
int t=r[nod];
while(pr[nod])
{
nod=pr[nod];
r[nod]=-1;
for(int j=0;j<v[nod].size();j++)
r[nod]=max(r[nod],r[v[nod][j]]);
if(r[nod]!=t)
break;
}
}
// for(int i=1;i<=y;i++)
// cout<<x[i].x<<' '<<x[i].y<<' '<<r[i]<<'\n';
int type,f,g;
for(int i=1;i<=m;i++)
{
fin>>type>>f>>g;
if(type==1)
{
a[f]=g;
nod=c[f];
int t=r[nod]=a[f];
while(pr[nod])
{
nod=pr[nod];
r[nod]=-1;
for(int j=0;j<v[nod].size();j++)
r[nod]=max(r[nod],r[v[nod][j]]);
}
}
else
{
int poz=f,ma=-1,ye;
while(poz<=g)
{
ye=c[poz];
while(1)
{
if(!pr[ye])
break;
if(x[pr[ye]].x<f||x[pr[ye]].y>g)
break;
ye=pr[ye];//cout<<x[ye].x<<' '<<x[ye].y<<' '<<pr[ye]<<'\n';
}
ma=max(ma,r[ye]);
poz=x[ye].y+1;
}
fout<<ma<<'\n';
}
}
}