求助,线段树写炸
  • 板块灌水区
  • 楼主FishingStar
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/11/24 22:33
  • 上次更新2023/11/5 07:23:31
查看原帖
求助,线段树写炸
231591
FishingStar楼主2020/11/24 22:33
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int a[40005];
int mi[40005];
int ma[40005]; 


inline int lchild(int cnt){
   return (cnt << 1);
}

inline int rchild(int cnt){
    return (cnt << 1) + 1;
}

void push_up(int p){
    mi[p] = min(mi[lchild(p)], ma[rchild(p)]);
    ma[p] = max(mi[lchild(p)], ma[rchild(p)]); 
}

void build_tree(int p, long long l, long long r){
    if(l == r){
    	mi[p] = a[l];
    	ma[p] = a[l];
    	return;
    }
	int mid = (l + r) >> 1;
	build_tree(lchild(p), l, mid);
	build_tree(rchild(p), mid + 1, r);
	push_up(p);
}

int que_min(int p, int l, int r, int ql, int qr){
    if(l <= ql && r <= qr){
        return mi[p];
	}
	int mid = (l + r) / 2;
	int ans = 1e9;
	if(ql <= mid){
	    ans = min(ans, que_min(lchild(p), l, mid, ql, qr));
	}
	if(qr > mid){
	    ans = min(ans, que_min(rchild(p), mid + 1, r, ql, qr));
	}
	return ans;
}

/*int que_max(int p, int l, int r, int ql, int qr){
    if(l <= ql && r <= qr){
        return ma[p];
	}
	int mid = (l + r) / 2;
	int ans = -1e9;
	if(ql <= mid){
	    ans = max(ans, que_min(lchild(p), l, mid, ql, qr));
	}
	if(qr > mid){
	    ans = max(ans, que_min(rchild(p), r, mid, ql, qr));
	}
	return ans;
}*/

int main(){
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
	}
	build_tree(1, 1, n);
	for(int i = 0; i < m; i++){
		int a, b;
		cin >> a >> b; 
	    cout << que_min(1, 1, n, a, b) << endl;
	}
    return 0;
}

2020/11/24 22:33
加载中...