Cod sursa(job #2058537)

Utilizator gundorfMoldovan George gundorf Data 5 noiembrie 2017 19:12:23
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#define Nmax 100005
#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=0; i<n; i++)
        fin>>v[i];
}
void Initializare_intervale ()
{
    int i;
    for (i=0; i<=n; i++)
    if (v[i]>intervale[i/lg]) intervale[i/lg]=v[i];
}

int Max_a_b (int a,int b)
{
    a--;
    b--;
    int maxim=0,k,i,j;
    k = a/lg + 1;


    for (i=k+1; i<=b/lg-1; i++)
        if (intervale[i]>maxim) maxim=intervale[i];
    //if (b/lg*lg+1>=a)
   if(a/lg!=b/lg)
    {
        for (j=a; j/lg==a/lg; j++)
            if (v[j]>maxim) maxim=v[j];

        for (i=b; i/lg==b/lg&&i; i--)
            if (v[i]>maxim) maxim=v[i];
    }
    else
    {
        for (i=a; i<=b; i++)
            if (v[i]>maxim) maxim=v[i];
    }

    return maxim;
}

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

    for (i=k*lg; i<=(k)*lg+lg-1; i++)
        if (v[i]>intervale[k]) intervale[k]=v[i];
}
int main()
{
    int i,x,y,z,j;
    Citire();
      lg=(int)sqrt(n);
    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;
}