Cod sursa(job #2551987)
Utilizator | Data | 20 februarie 2020 14:25:48 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.78 kb |
#include <fstream>
#include<cmath>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,r,v[100005];
int i,j,k,x,c,a,b;
struct nod{
int a,b,m;
}s[400];
int main()
{
f>>n>>m;
r=sqrt(n);
for(i=1;i<=n;i++)
f>>v[i];
for(j=1,x=0,k=0,i=1;i<=n;i++)
{
if(v[i]>x)
x=v[i];
if(i%r==0 || i==n)
{
k++;
s[k].a=j;
s[k].b=i;
s[k].m=x;
j=i+1;
x=0;
}
}
while(m)
{
f>>c>>a>>b;
if(c==0)
{
i=1+(a-1)/r;
j=1+(b-1)/r;
if(i==j)
{
x=0;
while(a<=b)
{
if(v[a]>x)
x=v[a];
a++;
}
g<<x<<"\n";
}
else{
x=0;
while(a<=s[i].b)
{
if(v[a]>x)
x=v[a];;
a++;
}
i++;
while(i<j)
{
if(s[i].m>x)
x=s[i].m;
i++;
}
a=s[j].a;
while(a<=b)
{
if(v[a]>x)
x=v[a];
a++;
}
g<<x<<"\n";
}
}
else
{
v[a]=b;
i=1+(a-1)/r;
x=0;
for(j=s[i].a;j<=s[i].b;j++)
{
if(v[j]>x)
x=v[j];
}
s[i].m=x;
}
m--;
}
return 0;
}