Cod sursa(job #843315)

Utilizator alexalbu95Albu Alexandru alexalbu95 Data 27 decembrie 2012 19:25:46
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

const int maxn=100005;

int A[maxn], n, m, i, x, poz, val, start, finish, maxim, nr, k;
char s[maxn*10+2];
void update(int nod, int st, int dr, int x, int poz)
{
    if(st==dr)
    {
        A[nod]=x;
        return;
    }

    int med=(st+dr)/2;

    if(poz<=med) update(2*nod, st, med, x, poz);
    else update(2*nod+1, med+1, dr, x, poz);

    A[nod]= max( A[2*nod], A[2*nod+1] );
}

void query(int nod, int st, int dr, int beg, int fin)
{
    if(beg<=st && dr<=fin)
    {
        maxim=max(maxim, A[nod]);
        return;
    }

    int med=(st+dr)/2;

    if(beg <= med) query(2*nod, st, med, beg, fin);
    if(med < fin) query(2*nod+1, med+1, dr, beg, fin);

}

int main()
{
    f>>n>>m; f.get();
    f.getline(s, maxn*10);
    g<<s<<"\n";
    x=strlen(s);
    while(s[i]<'0' || s[i]>'9') ++i;
    for(; i<=x; ++i)
    {
        if(s[i]>='0' && s[i]<='9') nr=nr*10+s[i]-'0';
        else
        {
            update(1, 1, n, nr, ++k);
            nr=0;
        }
    }
    /*for(i=1; i<=n; ++i)
    {
        f>>x;
        update(1, 1, n, x, i);
    }*/
    for(; m; --m)
    {
        f>>x>>start>>finish;
        if(x==0)
        {
            maxim=-1;
            query(1, 1, n, start, finish);

            g<<maxim<<"\n";
        }
        else
        {
            poz=start;
            val=finish;
            update(1, 1, n, val, poz);
        }
    }
}