Cod sursa(job #2786462)

Utilizator alien14Razvan alien14 Data 21 octombrie 2021 00:04:06
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <bits/stdc++.h>
	
using namespace std;
	
#define ll long long
	
#define l long
	
#define d double
	
#define si(x) scanf('%d', &x)
	
#define sl(x) scanf('%lld', &x)
	
#define ss(s) scanf('%s', s) 
	
#define pi(x) printf('%d', x)
	
#define pl(x) printf('%lld', x)
	
#define ps(s) printf('%s', s) 
	
#define pb push_back 
	
#define mp make_pair 
	
#define F first 
	
#define S second 
	
#define all(x) x.begin(), x.end() 
	
#define clr(x) memset(x, 0, sizeof(x))
	
#define sortall(x) sort(all(x)) 
	
typedef pair<int, int> pii; 
	
typedef pair<ll, ll> pl; 
	
typedef vector<int> vi; 
	
typedef vector<ll> vl; 
	
#define modulo 1000000007
	
#define FOR(i,a,b) for(int i=a;i<=b;i++)
	
typedef vector<pii> vpii;
	
#define NMAX 100002
	
ifstream fin("arbint.in");
ofstream fout("arbint.out");

long arbore[4*NMAX], valori[NMAX];
long pozitie, valoare, start, stop;
void create(long node, long left, long right)	
{
    if(left == right)
        arbore[node] = valori[left];
    else{
        long middle = left + (right - left)/2;
        create(2*node, left, middle);
        create(2*node + 1, middle + 1, right);
        arbore[node] = max(arbore[2*node], arbore[2*node + 1]);
    }	
}
void change_value(long node, long left, long right)	
{
    if(left == right)
    {
        arbore[node] = valoare;
    }
    else{
        long middle = left + (right - left)/2;
        if(pozitie <= middle)
        {
            change_value(2*node, left, middle);
        }
        else{
            change_value(2*node+1, middle + 1, right);
        }
        arbore[node] = max(arbore[2*node], arbore[2*node + 1]);
    }	
}
void query(long node, long left, long right)	
{
    if(start <= left && right <= stop)
    {
        valoare = max(valoare, arbore[node]);
    }
    else{
        long middle = left + (right - left)/2;
        if(start <= middle)
        {
            query(2*node, left, middle);
        }
        else
            query(2*node +1, middle+1, right);
    }	
}
int main() 	
{
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    long n,m;
    fin>>m>>n;
    FOR(i,1,n)
    {
        fin>>valori[i];
    }
    create(1,1,n);
    int querry, a, b;	
    while(m--)
    {
        fin>>querry;
        if(querry)
        {
            fin>>pozitie>>valoare;
            change_value(1,1,n);
        }
        else
        {
            fin>>start>>stop;
            valoare = 0;
            query(1,1,n);
            fout<<valoare<<'\n';
        }
    }
    return 0;
	
}