Cod sursa(job #2548533)

Utilizator Catalin_GriuGriu Catalin Catalin_Griu Data 16 februarie 2020 19:38:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m, q, x, y;
int v[100005];
int stree[400005];

void update(int node, int pos, int val, int st, int dr)
{
    if(st==dr){stree[node] = val; return;}
    int mid = (st+dr)/2;
    if(pos<=mid) update(node*2, pos, val, st, mid);
    else update(node*2+1, pos, val, mid+1, dr);
    stree[node] = max(stree[node*2], stree[node*2+1]);
}

int query(int x, int y, int st, int dr, int node)
{
    if(x<=st && y>=dr) return stree[node];
    int mid = (st+dr)/2;
    int max1 = 0, max2 = 0;
    if(x<=mid) max1 = query(x, y, st, mid, node*2);
    if(y>mid) max2 = query(x, y, mid+1, dr, node*2+1);
    return max(max1, max2);
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        fin>>v[i];
        update(1, i, v[i], 1, n);
    }

    for(int i=1; i<=m; i++)
    {
        fin>>q>>x>>y;
        if(q==1)
        {
            update(1, x, y, 1, n);
            v[x] = y;
        }
        else
            fout<<query(x, y, 1, n, 1)<<'\n';
    }
    return 0;
}