Cod sursa(job #2053200)

Utilizator gundorfMoldovan George gundorf Data 31 octombrie 2017 16:54:20
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#define Nmax 100000
#include <cmath>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m,v[Nmax];
int intervale[Nmax],lg;
void Citire ()
{
    int i;
    fin>>n>>m;
    for (i=1;i<=n;i++)
        fin>>v[i];
}
void Initializare_intervale ()
{
    int i,nr=0,k;
    lg=sqrt(n);
    k=1;
    for (i=1;i<=n;i++)
    {
        nr++;
        if (nr>lg)
        {
            nr=1;
            k++;
            intervale[k]=v[i];
        }
        else
            if (v[i]>intervale[k])
                 intervale[k]=v[i];

    }
}

int Max_a_b (int a ,int b)
{
    int maxim=0,k,i,j;
    k = a/lg + 1;
    for (i=k+1;i*lg<=b;++i)
        if (intervale[i]>maxim) maxim=intervale[i];
    for (j=b/lg*lg;j<=b;++j)
        if (v[j]>maxim) maxim=v[j];
    for (i=a;i<k*lg;++i)
        if (v[i]>maxim) maxim=v[i];
    return maxim;
}

void Update_a_b (int a,int b)
{
    int k=a/lg,i;
    v[a]=b;
    //fout<<k<<"morcovi ";
    intervale[k]=0;

    for (i=k*lg;i<(k+1)*lg;++i)
        if (v[i]>intervale[k]) intervale[k]=v[i];
}
int main()
{
    int i,x,y,z,j;
    Citire();
    Initializare_intervale();
    for (i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        if (x==0) fout<<Max_a_b(y,z)<<"\n";
        else {Update_a_b(y,z);
           /*for (j=1;j*lg<=n;j++)
        fout<<intervale[j]<<" ";
        fout<<"\n";*/
        }
    }

    return 0;
}