容易发现题目给的条件对数值的维护增长很慢,故可使用调整法,具体细节见代码(好像强行多了一个 log )
#include<bits/stdc++.h>
#define rep(i,k,n) for(int i=k;i<=n;i++)
#define rep2(i,k,n) for(int i=k;i>=n;i--)
using namespace std;
void sc(int& x){x=0;char c=getchar();while(c>'9' || c<'0')c=getchar();
for(;c>='0' && c<='9';c=getchar())x=x*10+c-'0';
}
const int N=1e6+7;
int s[N],n,m,a[N],nxt[N],cc=N;
int find(int x){
int l=1,r=n;
while(l<r){
int mid=(l+r+1)>>1;
if(s[mid]<=x)l=mid;
else r=mid-1;
}return l;
}
char c[N];
void solve(int& l,int& r,int q){
if(q==1){l=r=cc;return;}
if(s[r]-s[l-1]==q)return;
if(a[l]==1)l++,r++;
else{
int len1=nxt[l]-l;
int len2=nxt[r]-r;
if(len1+1<len2)l+=len1+1,r+=len1+1;
else l+=len2-1,r+=len2;
}
}
int main(){
scanf("%d%d%s",&n,&m,c+1);rep(i,1,n)if(c[i]=='T')a[i]=2;else a[i]=1,cc=i;
rep(i,1,n)s[i]=s[i-1]+a[i];int now=n+1;
rep2(i,n,1){
nxt[i]=now;
if(a[i]==1)now=i;
}
rep(i,1,m){
int q;sc(q);
if(q>s[n])puts("NIE");
else{
int pos=find(q),l=1;
solve(l,pos,q);
if(pos>n)puts("NIE");
else printf("%d %d\n",l,pos);
}
}
}