Cod sursa(job #1802950)

Utilizator cojocarugabiReality cojocarugabi Data 10 noiembrie 2016 20:30:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
# include <stdio.h>
# include <bits/stdc++.h>
using namespace std;
# define fi cin
# define fo cout
# define x first
# define y second
# define ll long long
# define IOS ios_base :: sync_with_stdio(0);cin.tie(0)
# define p(v) cerr << #v << " = " << v << '\n'
# define p2(v) cerr << #v << " = " << (complex < int > (v.x,v.y)) << '\n'
# define vi vector < int >
# define vll vector < ll >
# define pii pair < int , int >
# define mp make_pair
# define CF
int main(void)
{
    #ifdef CF
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    #endif // CF
    srand(time(0));
    fo << fixed << setprecision(7);
    cerr << fixed << setprecision(7);
    int n,m;
    IOS;
    fi>>n>>m;
    static int t[1 << 20];
    for (int i = n;i < n + n;++i)
        fi>>t[i];
    for (int i = n - 1;i;--i)
        t[i] = max(t[i << 1],t[i << 1 | 1]);
    while (m --)
    {
        int op;
        fi>>op;
        if (!op)
        {
            int l,r;
            fi>>l>>r;
            l += n - 1;r += n - 1;
            int ans = 0;
            for (;l <= r;l /= 2,r /= 2)
            {
                if (l & 1)
                    ans = max(ans,t[l++]);
                if (!(r & 1))
                    ans = max(ans,t[r--]);
            }
            fo << ans << '\n';
        }
        else
        {
            int l,r;
            fi>>l>>r;
            t[l += n - 1] = r;
            for (l /= 2;l >= 1;l /= 2)
                t[l] = max(t[l << 1],t[l << 1 | 1]);
        }
    }
    cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
    return 0;
}