Cod sursa(job #2746385)

Utilizator andreiiorgulescuandrei iorgulescu andreiiorgulescu Data 27 aprilie 2021 19:21:30
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N = 100005;
int n,m,maxim;
vector<int>a;
int arbint[N * 2];
void modific(int p, int a, int b, int poz, int val)
{
    /*
    p -> pozitia curenta  din vectorul arbint
    a,b sunt capetele intervalului curent/de start in situatia ta 1,n
    poz -> pozitia din intervalul a,b pe care vrei sa o modifici
    val -> valoarea pe care vrei sa o pui
    */
    if (b == a)
    {
        arbint[p] = val;
        return;
    }
    int mid = (a + b ) / 2;
    if (poz <= mid)
        modific(2 * p,a,mid,poz,val);
    else
        modific(2 * p + 1,mid + 1,b,poz,val);
    //cout << p << " " << arbint[2 * p] << " " << arbint[2 * p + 1] << '\n';
    arbint[p] = max(arbint[2 * p + 1],arbint[2 * p]);
}

void interogare(int p, int a, int b, int st, int dr)
{
    /*
    p -> pozitia curenta din vectorul arbint
    a,b sunt capetele intervalului curent/de start in situatia ta 1,n
    st,dr sunt capetele intervalului curent/de start pe care vrem sa aflam maximul
    */
    if (a >= st and b <= dr)
    {
        if (arbint[p] > maxim)
            maxim = arbint[p];
        return;
    }
    int mid = (a + b ) / 2;
    if (st <= mid)
        return interogare(2 * p,a,mid,st,dr);
    if (dr > mid)
        return interogare(2 * p + 1,mid + 1,b,st,dr);
}

int main()
{
    int i,t,x,y;
    in >> n >> m;
    for (i = 1; i <= n; i++)
    {
        in >> x;
        a.push_back(x);
        modific(1,1,n,i,x);
    }
    //for (i = 1; i < 2 * n; i++)
      //  cout << arbint[i] << " ";
    for (i = 1; i <= m; i++)
    {
        in >> t >> x >> y;
        if (t == 1)
            modific(1,1,n,x,y);
        else
        {
            maxim = -1;
            interogare(1,1,n,x,y);
            out << maxim << '\n';
        }
    }
    return 0;
}