segmenttree.cpp

Đã có bài viết về lazy update cho segment tree. Các bạn có thể mở hai trang con ở bên dưới.

Bài toán

Ban đầu, dãy số của chúng ta có n phần tử bằng 0.

m truy vấn:

U p q : gán phần tử a[p] thành q

Q p q : in ra phần tử lớn nhất trong khoảng từ p đến q

Độ phức tạp

O (m log n)

#include <stdio.h>

int T[10230997];

int n, m;

int max(int a, int b){ return a>b?a:b; }

int query(int node, int ll, int rr, int u, int v){

    if (v<ll or rr<u or ll>rr) { return -1000111000; }

    if (u<=ll and ll<=rr and rr<=v) return T[node];

    return max(

        query(node*2, ll, (ll+rr)/2, u, v),

        query(node*2+1, (ll+rr)/2+1, rr, u, v)

    );

}

void update(int node, int ll, int rr, int i, int v){

    if (i<ll or i>rr or ll>rr) return;

    if (ll!=rr){

        update(node*2, ll, (ll+rr)/2, i, v);

        update(node*2+1, (ll+rr)/2+1, rr, i, v);

        T[node] = max(T[node*2], T[node*2+1]);

    }

    else T[node] = v;

}

main(){

    int p, q; char c;

    init();

    scanf("%d%d", &n, &m);

    while (m--){

        scanf(" %c%d%d", &c, &p, &q);

        if (c=='u' or c=='U') update(1, 1, n, p, q);

        if (c=='q' or c=='Q') printf("%d\n", query(1, 1, n, p, q));

    }

}