注意写代码的时候上下限要定的大一些,避免数据比较夸张,最好直接用long long进行运算
原题
#includeusing namespace std; #define int long long const int N = 1e5 + 10; const int INF = 0x3f3f3f3f3f; int n, m; struct Node{ int l, r; int maxn; }tr[N * 4]; int w[N]; void push_up(int u){ tr[u].maxn = max(tr[u << 1].maxn, tr[u << 1 | 1].maxn); } void build(int u, int l, int r){ //此时tr[]还没哟值,所以不能用于判断 if(l == r) tr[u] = {l, r, w[r]}; else{ tr[u] = {l, r}; int mid = l + r >> 1; //建树的时候不用判断下一层的边界,直接建树即可 build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r); push_up(u); } } int query(int u, int l, int r){ if(l <= tr[u].l && r >= tr[u].r) return tr[u].maxn; int res = -INF; int mid = tr[u].l + tr[u].r >> 1; if(l <= mid) res = max(res, query(u << 1, l, r)); if(r > mid) res = max(res, query(u << 1 | 1, l, r)); return res; } signed main() { scanf("%lld %lld", &n, &m); for(int i = 1; i <= n; i ++ ){ scanf("%lld", &w[i]); } build(1, 1, n); while(m -- ){ int a, b; scanf("%lld%lld", &a, &b); printf("%lldn", query(1, a, b)); } return 0; }



