Cod sursa(job #2601287)

Utilizator TudorCristeaCristea Tudor TudorCristea Data 14 aprilie 2020 12:02:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>
#include <math.h>
#define INF 2000000000
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
int N,M;
int X[110000];
int lb;     /// lungime bucket-uri
int nrb;    /// numarul de bucket-uri
int Y[400];

/// X[poz]=val
void update(int poz,int val)
{
    X[poz]=val;
    int b;
    b=(poz-1)/lb+1;
    int st,dr;
    st=(b-1)*lb+1;
    dr=b*lb;
    int rez;
    rez=-INF;
    for (int i=st;i<=dr;i++)
        rez=max(rez,X[i]);
    Y[b]=rez;
}

/// returneaza min(X[st]...X[dr])
int query(int st, int dr)
{
    int bst,bdr;
    bst=(st-1)/lb+1;
    bdr=(dr-1)/lb+1;
    if (bst==bdr)
    {
        int rez;
        rez=-INF;
        for (int i=st;i<=dr;i++)
            rez=max(rez,X[i]);
        return rez;
    }
    else
    {
        int rez;
        rez=-INF;
        for (int i=bst+1;i<=bdr-1;i++)
            rez=max(rez,Y[i]);
        int p;
        p=bst*lb;
        for (int i=st;i<=p;i++)
            rez=max(rez,X[i]);
        p=(bdr-1)*lb+1;
        for (int i=p;i<=dr;i++)
            rez=max(rez,X[i]);
        return rez;
    }
}

int main()
{
    fi>>N>>M;
    for (int i=1;i<=N;i++)
        fi>>X[i];
    lb=(int)sqrt((double)N);
    int rest;
    rest=N % lb;
    if (rest==0)
        nrb=N/lb;
    else
        nrb=N/lb+1;
    int p;
    p=N+1;
    while (p<=lb*nrb)
    {
        X[p]=-INF;
        p++;
    }
    for (int i=1;i<=nrb;i++)
        Y[i]=-INF;
    for (int i=1;i<=N;i++)
    {
        int b;
        b=(i-1)/lb+1;
        Y[b]=max(Y[b],X[i]);
    }
    for (int q=1;q<=M;q++)
    {
        int tip;
        fi>>tip;
        if (tip==0)
        {
            /// query
            int st,dr;
            fi>>st>>dr;
            fo<<query(st,dr)<<"\n";
        }
        else
        {
            /// update
            int poz,val;
            fi>>poz>>val;
            update(poz,val);
        }
    }
    fi.close();
    fo.close();
    return 0;
}