思路挺常规的,因为题目要求不区分大小写,并且输出原字符串,那么就改一下max函数的比较方式。
#include<bits/stdc++.h>
using namespace std;
int n,m;
string a[500010];
struct node{
int l,r;
string maxn;
}tree[2000010];
string max1(string a,string b)//改一下比较方式不就完事了
{
string aa="",bb="";
for(int i=0;i<a.size();i++)
aa[i]=tolower(a[i]);
for(int i=0;i<b.size();i++)
bb[i]=tolower(b[i]);
return aa>bb?a:b;
}
void build(int p,int l,int r)
{
tree[p].l=l;
tree[p].r=r;
if(l==r)
{
tree[p].maxn=a[l];
return ;
}
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
tree[p].maxn=max1(tree[p*2].maxn,tree[p*2+1].maxn);
}
string query1(int p,int l,int r)
{
if(l<=tree[p].l&&tree[p].r<=r)
{
return tree[p].maxn;
}
int mid=(tree[p].l+tree[p].r)>>1;
string ss="";
if(l<=mid)
ss=max1(ss,query1(p*2,l,r));
if(r>mid)
ss=max1(ss,query1(p*2+1,l,r));
return ss;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
string s=query1(1,l,r);
cout<<s;
printf("\n");
}
return 0;
}