数据过水,线段树AC
查看原帖
数据过水,线段树AC
1010766
materia1ist楼主2024/11/2 08:43

借@cj1314的代码加了点优化

#include <bits/stdc++.h>
//#define int long long
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define rep(i,l,r) for(register int i(l);i<=r;++i)
#define per(i,r,l) for(register int i(r);i>=l;--i)
using namespace std;
int n,m,a[100005];
struct tree{
    int l,r,big;
}t[400005];
inline char gc()
{
    static char buf[1<<20], *p1 = buf, *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<20, stdin), p1 == p2) ? EOF : *p1 ++;
}
inline void wr(int x) {
  static int sta[20];
  int top = 0;
  do {
    sta[top++] = x % 10, x /= 10;
  } while (x);
  while (top) putchar(sta[--top] + 48);
}
int read()
{
	int n = 0;
    bool w = 0;
    char c = gc();
    for(; c < 48 || c > 57; c = gc())
        w = c == 45;
    for(n = 0; c >= 48 && c <= 57; c = gc())
        n = (n<<3)+(n<<1) + (c ^ 48);
    n = w ? -n : n;
    return n;
}
inline void build(int p,int l,int r){
    t[p].l=l,t[p].r=r;
    if(l==r){
        t[p].big=a[l];
        return;
    }
    int mid=l+r>>1;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    t[p].big=max(t[ls(p)].big,t[rs(p)].big);
}
inline int ask(int p,int &l,int &r){
    if(t[p].r<l||t[p].l>r)return 0;
    if(t[p].l>=l&&t[p].r<=r)return t[p].big;
	int ret=0;
    ret=max(ret,ask(ls(p),l,r));
    ret=max(ret,ask(rs(p),l,r));
    return ret;
}
int main() {
    n=read(),m=read();
    rep(i,1,n)a[i]=read();
    build(1,1,n);
    rep(i,1,m){
        int l=read(),r=read();
        wr(ask(1,l,r));
        putchar('\n');
    }
	return 0;
}

极限764ms卡过 %%%%%%%%%

2024/11/2 08:43
加载中...