Cod sursa(job #2551987)

Utilizator suzanicaSuzanica Mihu suzanica 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;
}