Cod sursa(job #1940152)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 26 martie 2017 14:20:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <cstdio>
#define MAXN 100005
using namespace std;

inline int max(int a, int b)
{
    return (a>b) ? (a) : (b);
}

class Input
{
    char *b;
    int bs,bi;
    inline bool isdigit(char c)
    {
        return c>='0' && c<='9';
    }
public:
    Input(const char *s)
    {
        FILE *f = fopen(s,"r");
        fseek(f,0,SEEK_END);
        bs = ftell(f);
        fseek(f,0,SEEK_SET);
        b = new char[bs+1];
        fread(b,1,bs,f);
        bi = 0;
    }
    Input& operator>>(int &x)
    {
        x = 0;
        while(!isdigit(b[bi]))
            ++bi;
        while(isdigit(b[bi]) && bi<bs)
        {
            x = x * 10 + b[bi] - '0';
            ++bi;
        }
        return *this;
    }
};

int n, m, a[MAXN];

int tree[MAXN*4];
int pos, val, inc, sf;

void update(int st,int dr,int pai)
{
    if(st==dr)
    {
        tree[pai] = val;
    }
    else
    {
        int mid = (st + dr) >> 1;
        if(pos <= mid)
        {
            update(st,mid,pai<<1);
        }
        else
        {
            update(mid+1,dr, (pai<<1) + 1);
        }
        tree[pai] = max(tree[pai<<1],tree[(pai<<1) + 1]);
    }
}

int query(int st,int dr,int pai)
{
    if(inc <= st && dr <= sf)
    {
        return tree[pai];
    }
    if(sf < st || dr < inc)
    {
        return 0;
    }
    int mid = (st + dr) >> 1;
    return max(query(st,mid,(pai<<1)),query(mid+1,dr,(pai<<1) + 1));
}


int main()
{
    Input in("arbint.in");
    freopen("arbint.out","w",stdout);

    in>>n>>m;

    for(int i=1;i<=n;i++)
    {
        in>>a[i];
        pos = i;
        val = a[i];
        update(1,n,1);
    }

    for(int i=1;i<=m;i++)
    {
        int tip, a, b;
        in>>tip>>a>>b;
        if(tip)
        {
            pos = a;
            val = b;
            update(1,n,1);
        }
        else
        {
            inc = a;
            sf = b;
            printf("%d\n", query(1,n,1));
        }
    }

    return 0;
}