rt ,线段树T飞
求助
#include<bits/stdc++.h>
using namespace std;
namespace FastIO
{
inline int input()
{
int num = 0,f = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
num = (num << 1) + (num << 3) + (ch ^ 48);
ch = getchar();
}
return num * f;
}
inline void printNum(int num)
{
if(num >= 10) printNum(num / 10);
putchar(num % 10 + 48);
}
inline void print(int num,char ch = '\n')
{
if(num < 0) putchar('-'),num = -num;
printNum(num);
putchar(' ');
putchar(ch);
}
}
using FastIO::input;
using FastIO::print;
const int N = 2e5 + 5;
int n,m;
string ipt[N];
map <string,string> mp;
string change(string str)
{
if(mp.find(str) != mp.end()) return mp[str];
string tmp = str;
for(int i = 0;i < str.length();i++)
if(str[i] >= 'A' && str[i] <= 'Z') str[i] = (str[i] - 'A' + 'a');
return mp[tmp] = str;
}
string max(string a,string b)
{
string as = change(a),bs = change(b);
return as > bs ? a : b;
}
struct SegmentTree
{
struct node
{
int l,r;
string val;
#define l(pos) tree[pos].l
#define r(pos) tree[pos].r
#define val(pos) tree[pos].val
}tree[N << 2];
#define mid(pos) (tree[pos].l + tree[pos].r >> 1)
#define midn (l + r >> 1)
void build(int l,int r,int pos)
{
l(pos) = l,r(pos) = r;
if(l == r) {val(pos) = ipt[l];return;}
build(l,midn,pos*2);
build(midn+1,r,pos*2+1);
val(pos) = max(val(pos*2),val(pos*2+1));
}
string query(int l,int r,int pos)
{
if(l(pos) >= l && r >= r(pos)) return val(pos);
string ans;
if(l <= mid(pos)) ans = max(ans,query(l,r,pos*2));
if(r > mid(pos)) ans = max(ans,query(l,r,pos*2+1));
return ans;
}
#undef l
#undef r
#undef tag
#undef val
#undef mid
#undef midn
};
SegmentTree ST;
int main()
{
// freopen("P1531_1.in","r",stdin);
// freopen("P1531.out","w",stdout);
n = input(),m = input();
for(int i = 1;i <= n;i++)
cin >> ipt[i];
ST.build(1,n,1);
for(int i = 1;i <= m;i++)
{
int a = input(),b = input();
cout << ST.query(a,b,1) << endl;
}
}