线段树模板(求最大最小)

来源:互联网 发布:iphone上看小说的软件 编辑:程序博客网 时间:2024/06/07 09:20
#include<cstdio>const int INF = 0xffffff0;const long long IINF = 1e18;int minV = INF;int maxV = -INF;int max(int &a, int &b){    return a > b ? a : b;}int min(int &a, int &b){    return a < b ? a : b;}struct Node//不要左右子节点指针的做法{    int L, R;    int minV, maxV;    int Mid()    {        return (L + R) / 2;    }}tree[800000];//4倍叶子节点的数量就够void BuildTree(int root, int L, int R){    tree[root].L = L;    tree[root].R = R;    tree[root].minV = INF;    tree[root].maxV = -INF;    if (L != R)    {        BuildTree(2 * root + 1, L, (L + R) / 2);        BuildTree(2 * root + 2, (L + R) / 2 + 1, R);    }}void Insert(int root, int i, int v)//将第i个数,其值为v,插入线段树{    if (tree[root].L == tree[root].R)    {        tree[root].minV = tree[root].maxV = v;        return;    }    tree[root].minV = min(tree[root].minV, v);    tree[root].maxV = max(tree[root].maxV, v);    if (i <= tree[root].Mid())Insert(2 * root + 1, i, v);    else Insert(2 * root + 2, i, v);}void Query(int root, int s, int e)//查询区间[s,e]中的最小值和最大值,如果更优就记录在全{    if (tree[root].minV >= minV&&tree[root].maxV <= maxV)    {        return;    }    if (tree[root].L == s&&tree[root].R == e)    {        minV = min(minV, tree[root].minV);        maxV = max(maxV, tree[root].maxV);        return;    }    if (e <= tree[root].Mid())Query(2 * root + 1, s, e);    else if (s > tree[root].Mid())Query(2 * root + 2, s, e);    else    {        Query(2 * root + 1, s, tree[root].Mid());        Query(2 * root + 2, tree[root].Mid() + 1, e);    }}int main(){    int n, q, h;    int i, j, k;    while (scanf("%d%d", &n, &q))    {        BuildTree(0, 1, n);        for (int i = 1; i <= n; i++)        {            scanf("%d", &h);            Insert(0, i, h);        }        for (int i = 0; i < q; i++)        {            int s, e;            char ch[3];            scanf("%s", ch);            if (ch[0] == 'Q')            {                scanf("%d%d", &s, &e);                minV = INF;                maxV = -INF;                Query(0, s, e);                printf("%d\n", maxV);            }            else            {                scanf("%d%d", &s, &e);                Insert(0, s, e);            }        }    }    return 0;}
阅读全文
0 0