记录编号 426943 评测结果 AAAAAAAAAA
题目名称 延绵的山峰 最终得分 100
用户昵称 GravatarHeHe 是否通过 通过
代码语言 C++ 运行时间 0.219 s
提交时间 2017-07-19 20:54:48 内存使用 4.63 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5.  
  6. #define MAXN (1000010)
  7.  
  8. char ops[1 << 18], *opt = ops, *const opt_end = ops + (1 << 18);
  9.  
  10. inline char getc(void) {
  11. static char buf[1 << 18], *fs, *ft;
  12. return (fs == ft && (ft = (fs = buf) + fread(buf, 1, sizeof(buf), stdin)), fs == ft) ? EOF : *fs++;
  13. }
  14.  
  15. inline int read(void) {
  16. register int res = 0;
  17. register char tmp = getc();
  18. while(!isdigit(tmp)) tmp = getc();
  19. while(isdigit(tmp))
  20. res = ((res + (res << 2)) << 1) + (tmp ^ 0x30),
  21. tmp = getc();
  22. return res;
  23. }
  24.  
  25. inline void write_all(void) {
  26. fwrite(ops, 1, opt - ops, stdout);
  27. opt = ops; return ;
  28. }
  29.  
  30. inline void write(int x) {
  31. static char *p = new char[20]();
  32. do{
  33. *(++p) = (x % 10) | 0x30;
  34. x /= 10;
  35. }while(x);
  36.  
  37. while(*p) {
  38. *(opt++) = *(p--);
  39. if(opt == opt_end) write_all();
  40. }
  41.  
  42. *(opt++) = '\n';
  43. if(opt == opt_end) write_all();
  44. return ;
  45. }
  46.  
  47. struct NODE{
  48. int mx;
  49. NODE *ls, *rs;
  50.  
  51. NODE() {
  52. ls = rs = NULL;
  53. }
  54. };
  55.  
  56. NODE *Build(int l, int r);
  57. int Query(NODE *node, int l, int r, int L, int R);
  58.  
  59. NODE *root;
  60. int s[MAXN];
  61. int N, Q;
  62.  
  63. int main() {
  64. #ifndef LOCAL
  65. freopen("climb.in", "r", stdin);
  66. freopen("climb.out", "w", stdout);
  67. #endif
  68. N = read();
  69. for(int i = 0, *p = s; i <= N; ++i, ++p) *p = read();
  70. root = Build(0, N);
  71. Q = read();
  72. for(int i = 0, l, r; i < Q; ++i) {
  73. l = read(), r = read();
  74. write(Query(root, l, r, 0, N));
  75. }
  76. write_all();
  77. return 0;
  78. }
  79.  
  80. NODE *Build(int l, int r) {
  81. NODE *p = new NODE();
  82. if(l ^ r) {
  83. register int mid = (l + r) >> 1;
  84. p->ls = Build(l, mid);
  85. p->rs = Build(mid + 1, r);
  86. p->mx = max(p->ls->mx, p->rs->mx);
  87. } else p->mx = s[l];
  88. return p;
  89. }
  90.  
  91. int Query(NODE *node, int l, int r, int L, int R) {
  92. if(l == L && r == R) return node->mx;
  93. register int mid = (L + R) >> 1;
  94. if(r <= mid) return Query(node->ls, l, r, L, mid);
  95. if(mid < l) return Query(node->rs, l, r, mid + 1, R);
  96. return max(Query(node->ls, l, mid, L, mid), Query(node->rs, mid + 1, r, mid + 1, R));
  97. }