美文网首页
线段树模板区间最大最小

线段树模板区间最大最小

作者: _弓长_大人 | 来源:发表于2018-09-25 12:44 被阅读8次
// Asimple
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <vector>
#include <string>
#include <cstring>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#define INF 0x3f3f3f3f
#define debug(a) cout<<#a<<" = "<<a<<endl
#define test() cout<<"============"<<endl
#define CLS(a,v) memset(a, v, sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int dx[] = {-1,1,0,0,-1,-1,1,1}, dy[]={0,0,-1,1,-1,1,1,-1};
const int maxn = 140000;
const ll mod = 233;
int n, m, T, len, cnt, num, ans, Max, k;
int x, y;
pair<int, int> dat[4*maxn];

void init() {
    for (int i = 0; i < 2 * n - 1; ++i) {
        dat[i].first = INF;
        dat[i].second = -INF;
    }
}
void update(int k, int x) {
    k += n - 1;
    dat[k] = pair<int, int>(x, x);
    while (k > 0) {
        k = (k - 1) / 2;
        dat[k].first = min(dat[2 * k + 1].first, dat[2 * k + 2].first);
        dat[k].second = max(dat[2 * k + 1].second, dat[2 * k + 2].second);
    }
}

pair<int, int> query(int a, int b, int k, int l, int r) {
    if (a <= l && r <= b) return dat[k];
    if (a > r || b < l) return pair<int, int>(INF, -INF);
    pair<int, int> vl = query(a, b, 2 * k + 1, l, (l + r) / 2);
    pair<int, int> vr = query(a, b, 2 * k + 2, (l + r) / 2 + 1, r);
    return pair<int, int>(min(vl.first, vr.first), max(vl.second, vr.second));
}

void input(){
    for(scanf("%d", &T); T--; ) {
        scanf("%d", &k);
        n = (int)pow(2, k);
        init();
        for(int i=0; i<n; i++) {
            scanf("%d", &num);
            update(i, num);
        }
        for(scanf("%d", &m); m--; ) {
            scanf("%d%d%d",&k, &x, &y);
            if( k == 2 ) update(x, y);
            else {
                pair<int, int> p = query(x, y, 0, 0, n-1);
                ll ans = min((ll)p.first*p.first, min((ll)p.second*p.second, (ll)p.first*p.second));
                printf("%lld\n", ans);
            }
        }
    }
}

int main() {
    input();
    return 0;
}

相关文章

  • 2018-04-03线段树讲解

    线段树插叙区间最大最小和

  • 线段树模板区间最大最小

  • 基础九 线段树Segment Tree

    线段树功能: O(logN) 找到某区间的 最大最小值 元素个数 区间和 O(1) 得到全部区间的 最大最小值 元...

  • 线段树专题整理

    待更新 线段树讲解(未读)线段树模板(未读) 模板 求区间总和 A - 敌兵布阵 HDU - 1166 题意 线段...

  • 线段树

    一、线段树建树、单点修改、区间查询 二、线段树建树、区间修改、区间查询

  • 线段树

    [toc] 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn。(2).线段树算...

  • 线段树区间修改模板

    对应的水题是poj3468 今天实验室的大牛说了线段树的区间修改值在求和,(其实自己线段树还没懂太多了)觉得他们好...

  • 算法模板(七) 线段树

    线段树单点操作 线段树区间操作

  • 线段树模板(区间加、区间乘)

    题目描述 如题,已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上x2.将某区间每一个数乘上x3.求出...

  • 数据结构-线段树

    线段树定义: 线段树是一种二叉搜索树,又叫区间树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个...

网友评论

      本文标题:线段树模板区间最大最小

      本文链接:https://www.haomeiwen.com/subject/xhxhextx.html