Cod sursa(job #1180406)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 30 aprilie 2014 16:44:25
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include<fstream>
#include<cmath>
#include<algorithm>
#include<bitset>
using namespace std;

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

int n,m,a[100005],sq[100005],lg,lungime,part[100005];
bitset<100005>viz;

inline void Citire()
{
    int i;
    fin>>n>>m;
    for (i=1;i<=n;i++)
        fin>>a[i];
}

inline void Imparte()
{
    int i,k;
    lg=sqrt(n);
    lungime=0;
    for (i=1;i<=n;i+=lg)
        {
            int maxim=-1;
            viz[i]=1;
            lungime++;
            for (k=i;k<=i+lg-1 && k<=n;k++)
                {
                    maxim=max(maxim,a[k]);
                    part[k]=lungime;
                }
            sq[lungime]=maxim;
        }
}

inline void Rezolva()
{
    int i,j,op,x,y,lg,maxim;
    lg=sqrt(n);
    for (i=1;i<=m;i++)
        {
            fin>>op>>x>>y;
            if (!op)
                {
                    maxim=-1;
                    while (!viz[x] && x<=y)
                        {
                            maxim=max(maxim,a[x]);
                            x++;
                        }
                    while (x+lg-1<=y)
                        {
                            maxim=max(maxim,sq[part[x]]);
                            x+=lg-1;
                        }
                    while (x<=y)
                        {
                            maxim=max(maxim,a[x]);
                            x++;
                        }
                    fout<<maxim<<"\n";
                }
            else
                {
                    maxim=-1;
                    a[x]=y;
                    j=x;
                    while (!viz[j]) j--;
                    maxim=max(maxim,a[j]);
                    j++;
                    while (!viz[j] && j<=n)
                        {
                            maxim=max(maxim,a[j]);
                            j++;
                        }
                    sq[part[x]]=maxim;
                }
        }
}

int main()
{
    Citire();
    Imparte();
    Rezolva();
    return 0;
}