Cod sursa(job #2347702)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 19 februarie 2019 00:11:57
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#define Nmax 100005

using namespace std;

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

int n, m, q, a, b;
int v[Nmax], ai[4*Nmax];
int ansQ;

void build(int poz, int st, int dr)
{
    int mj=(st+dr)/2, fs=(poz << 1);

    if(st == dr)
    {
        ai[poz]=v[st];
        return;
    }

    build(fs, st, mj);
    build(fs+1, mj+1, dr);
    ai[poz]=max(ai[fs], ai[fs+1]);
}

void update(int poz, int st, int dr, int x, int pozUpd)
{
    int mj=(st+dr)/2, fs=(poz << 1);
    if (st == dr)
    {
		ai[poz] = x;
		return;
    }
    if(pozUpd <= mj)
        update(fs, st, mj, x, pozUpd);
    else
        update(fs+1, mj+1, dr, x, pozUpd);
    ai[poz]=max(ai[fs], ai[fs+1]);
}

void query(int poz, int st, int dr, int qst, int qdr)
{
    int mj=(st+dr)/2, fs=(poz << 1);

    if(st > qdr || dr < qst) return;

    if(qst <= st && qdr >= dr)
    {
        ansQ=max(ansQ, ai[poz]);
        return;
    }

    if(qst <= mj)
        query(fs, st, mj, qst, qdr);
    if(qdr > mj)
        query(fs+1, mj+1, dr, qst, qdr);

}

int main()
{
    f >> n >> m;
    for (int i = 1; i <= n; i++) f >> v[i];

    build(1, 1, n);

    while(m--)
    {
        f >> q >> a >> b;
        if(q == 0)
        {
            ansQ=-1;
            query(1, 1, n, a, b);
            g << ansQ << '\n';
        }
        else update(1, 1, n, b, a);
    }

    return 0;
}