Cod sursa(job #1547934)

Utilizator SoniaFlorinaHorchidan Sonia-Florina SoniaFlorina Data 10 decembrie 2015 09:33:21
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

ifstream in ("arbint.in");
ofstream out ("arbint.out");

int n, m, q, a, b;
long long v[100010], w[400];

int main()
{
    in>>n>>m;
    int i, j=1, l=sqrt(n), maxim=0, x, y;
    for(i=1; i<=n ;i++)
           in>>v[i];
    if(n%l!=0)
    {
        for(i=n+1;i<=n+l; i++)
            v[i]=0;
        n+=l;
    }
     for(i=1; i<=n ;i++)
        {
            if(i%l==1)
                maxim=v[i];
            else
                if(i%l==0)
                    {
                        if(v[i]>maxim)
                            maxim=v[i];
                        w[j]=maxim;
                        j++;
                    }
                else
                    if(v[i]>maxim)
                        maxim=v[i];
        }


    for(i=1; i<=m; i++)
    {
        in>>q>>a>>b;

        if(q==0) //maximul pe intervalul [a,b]
        {
            maxim=v[a];
            x=a/l+1;
            y=b/l;
            if(x!=y)
            {
                for(j=x;j<=y;j++)
                    if(w[j]>maxim)
                        maxim=w[j];
                while(a%l!=1)
                {
                    if(v[a]>maxim)
                        maxim=v[a];
                    a++;
                }
                while(b%l!=0)
                {
                    if(v[b]>maxim)
                        maxim=v[b];
                    b--;
                }
            }
            else
                for(j=a+1;j<=b;j++)
                    if(v[j]>maxim)
                        maxim=v[j];

            out<<maxim<<'\n';

        }
        else
            if(q==1) //v[a]=b
            {
                v[a]=b;
                x=a/l;
                if(a%l!=0)
                    x++;
                 w[x]=b;
                 for(j=(x-1)*l+1; j<=x*l; j++)
                    if(v[j]>w[x])
                        w[x]=v[j];
            }
    }

    in.close();
    out.close();

    return 0;
}