say一下思路:
每次将字符串左右的信息以及长度存起来,然后查询的时候利用二分查询id的位置大概位于len的哪一个位置吧,然后在用二分不断
#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define endl "\n"
#define yes cout<<"Yes\n";
#define no cout<<"No\n";
using namespace std;
const int M=1e6+10;
struct node{
int l,r;
int len;
}a[1020];
void sol()
{
int n,c,q;
cin>>n>>c>>q;
string s; cin>>s; s=" "+s;
a[0].len=n;
for(int i=1;i<=c;i++)
{
cin>>a[i].l>>a[i].r;
a[i].len=a[i-1].len+(a[i].r-a[i].l+1);
}
while(q--)
{
int id; cin>>id;
int l,r,ans;
l=0,r=c+1,ans=0;
while(l<r)
{
int mid=(l+r)/2;
if(a[mid].len>=id) ans=mid,r=mid;
else l=mid+1;
}
while(ans>0 && id>n)
{
int l,r,ans;
l=0,r=c+1,ans=0;
while(l<r)
{
int mid=(l+r)/2;
if(a[mid].len>=id) ans=mid,r=mid;
else l=mid+1;
}
id=id-a[ans-1].len+a[ans].l-1;
}
cout<<s[id]<<endl;
}
return ;
}
signed main()
{
ios;
int t=1;
cin>>t;
while(t--) sol();
return 0;
}
将id前移,范围到了原字符串长度退出并输出