Cod sursa(job #1436141)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 15 mai 2015 11:24:21
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
/**
  *     Worg
  *     Min & Max pe AIB
  */
#include <cstdio>

#define buffDIM 10000
#define DIM 100100
#define zeros(x) ((x ^ (x - 1)) & x)

using namespace std;
FILE *fin=freopen("arbint.in","r",stdin);
FILE *fout=freopen("arbint.out","w",stdout);

char buff[buffDIM];
int AIB[DIM], v[DIM];
int N, M, pos;

void read(int &x)
{
    while( buff[pos] < '0' || buff[pos] > '9' )
        if( ++pos == buffDIM )
        {
            fread(buff, 1, buffDIM, stdin); pos = 0;
        }

    x = 0;
    while( buff[pos] >= '0' && buff[pos] <= '9' )
    {
        x = x * 10 + buff[pos] - '0';
        if( ++pos == buffDIM )
        {
            fread(buff, 1, buffDIM, stdin); pos = 0;
        }
    }
}

inline int Query(int left, int right)
{
    int ret = 0;
    while(left <= right)
    {
        if(right - zeros(right) + 1 >= left)
        {
            if( v[ret] < v[ AIB[right] ] )
                ret = AIB[right];
            right -= zeros(right);
        }
        else
        {
            if( v[ret] < v[right] )
                ret = right;
            --right;
        }
    }
    return ret;
}

inline void Update(int pos)
{
    int i, val;
    for(i = pos; i <= N; i += zeros(i))
    {
        if( AIB[i] == pos )
        {
            val = Query(i - zeros(i) + 1,i - 1);
            if(v[val] > v[i])
                AIB[i] = val;
            else
                AIB[i] = i;
        }
        else
            if( v[pos] > v[ AIB[i] ] )
                AIB[i] = pos;
    }
}

void Set()
{
    int i;
    fread(buff, 1, buffDIM, stdin);

    v[0] = -1;
    read(N); read(M);
    for(i = 1; i <= N; ++i)
    {
        read( v[i] );
        Update(i);
    }
}

void Solve()
{
    int i, op, a, b;
    for(i = 1; i <= M; ++i)
    {
        read(op); read(a); read(b);
        if( op == 1 )
        {
            v[a] = b;
            Update(a);
        }
        else
            printf("%d\n", v[ Query(a, b) ]);
    }
}

int main()
{
    Set();
    Solve();
    return 0;
}