Cod sursa(job #1743935)

Utilizator sulzandreiandrei sulzandrei Data 18 august 2016 23:11:12
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <cstdio>
#include <algorithm>

using namespace std;
#define sizez 100004

int A[sizez],a,b,m,n,tip;
int Max[sizez],St[sizez],Dr[sizez];

int size = 0;
void Update();
int Query();
void smenuLuiBatog()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i = 1 ; i <= n ; i ++)
    {
        scanf("%d",&A[i]);
        if( size*size<=n)
            size++;
    }
    size--;
    for(int i = 1 ; i *size <= n ; i++)
    {
        Max[i] = -1;
        St[i] = size*(i-1)+1; Dr[i] = size*i;
        for(int pos = St[i] ; pos <= Dr[i]; pos++)
            Max[i] = max(Max[i],A[pos]);
    }
    while(m--)
    {
        scanf("%d %d %d",&tip,&a,&b);
        if(tip)
            Update();
        else
            printf("%d\n",Query());
    }
}
void Update()
{
    A[a] = b;
    for(int i = 1 ; i*size <= n ; i++)
        if(St[i]<= a && a <= Dr[i])
        {
            Max[i] = -1;
            for(int pos = St[i] ; pos <=Dr[i] ; pos++)
                Max[i] = max(Max[i],A[pos]);
            break;
        }
}
int Query()
{
    int valmaxim = -1;
    bool caz2 = true, caz3 = true;
    int capata, inceputb;
    for(int i = 1 ; i*size <= n ; i++)
    {
        if(a <= St[i] && Dr[i] <= b)
            valmaxim = max(valmaxim,Max[i]);
        if(a == St[i])
            caz2 = false;
        if(b == Dr[i])
            caz3 = false;
        if(a >= St[i] && a <=Dr[i])x
            capata = Dr[i];
        if(b >= St[i] && b <=Dr[i])
            inceputb = St[i];
    }
    if(size*size < b)
        inceputb = size*size + 1;

    if(caz2)
        for(int i = a ; i <= min(capata,b) ; i++)
            valmaxim = max(valmaxim,A[i]);

    if(caz3)
        for(int i = max(inceputb,a); i<= b;  i++)
            valmaxim = max(valmaxim,A[i]);
    return valmaxim;
}
int main()
{

    smenuLuiBatog();
    return 0;
}