Cod sursa(job #2481266)

Utilizator Bogdy_PPrunescu Bogdan Bogdy_P Data 26 octombrie 2019 18:05:18
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in ("arbint.in");
ofstream out("arbint.out");
int maxim, poz, val, o, n, m, a[100010], arb[400010];
void build(int st = 1, int dr = n, int nod = 1)
{
    if(st == dr)
    {
        arb[nod] = a[st];
        return ;
    }
    int mij = (st + dr) / 2;
    build(st, mij, nod * 2);
    build(mij + 1, dr, nod * 2 + 1);
}
void update(int poz, int nod, int st, int dr)
{
    if(st == dr)
    {
        arb[nod] = val;
        return;
    }
    int med = (st + dr) / 2;
    if(med >= poz)
        update(poz, nod * 2, st, med);
    else
        update(poz, nod * 2 + 1, med + 1, dr);
    arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}
void query(int x, int y, int nod, int st, int dr)
{
    if(st >= x && dr <= y)
    {
        maxim = max(maxim, arb[nod]);
        return;
    }
    int med = (st + dr) / 2;
    if(med >= x)
        query(x, y, nod * 2, st, med);
    if(y >= med)
        query(x, y, nod * 2 + 1, med + 1, dr);
}
int main()
{
    in >> n >> m;
    for(int i = 1;i <= n;i++)
        in >> a[i];
    build();
    for(int i = 1;i <= m;i++)
    {
        in >> o >> poz >> val;
        if(o == 0)
        {
            maxim = 0;
            query(1, n, 1, poz, val);
            out << maxim << '\n';
        }
        else
            update(poz, 1, 1, n);
    }
    return 0;
}