8 关调绿题不过分吧
查看原帖
8 关调绿题不过分吧
540363
AKPC楼主2024/3/16 11:14
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mpr make_pair
#define fr first
#define sc second
inline int read(){
	int res=0,f=1;char c=getchar();
	while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9') {res=res*10+(c-'0');c=getchar();}
	return res*f;
}
const int N=1e5+5;
int n,q,c,ans[N];
struct node{int X,I;}qr[N];
bool comp(node o,node p){return o.X<p.X;}
unordered_map<int,int>mp;
pair<int,int>g[N];
vector<int>vec;
int get(int n){
	int ans=0;
	vector<int>sb;
	for (int i=vec.size()-1;i>=0&&!ans;i--){
		sb.push_back(n);
		if (mp[n]!=0) ans=mp[n];
		if (vec[i]!=0) n=(n-1)%vec[i]+1;
	}
	for (auto i:sb) mp[i]=mp[sb[sb.size()-1]];
	return ans;
}
void solve(){
	n=read(),q=read(),c=0;
	mp.clear();
	for (int i=1;i<=n;i++){
		int x=read(),y=read();
		g[i]=mpr(x,y);
	}
	for (int i=1;i<=q;i++){
		qr[i].X=read();
		qr[i].I=i;
	}
	sort(qr+1,qr+q+1,comp);
	vec.clear();
	int tip=1;
	for (int i=1;i<=n;i++){
		int op=g[i].fr,x=g[i].sc;
		if (op==1){
			mp[++c]=x,vec.push_back(0);
			while (qr[tip].X==c&&tip<=q) ans[qr[tip++].I]=x;
		}
		else{
			vec.push_back(c);
			while (qr[tip].X<=c*x+c&&tip<=q) ans[qr[tip].I]=get(qr[tip++].X);
			c+=c*x;
		}
		if (c>1e18||q<tip) break;
	}
	for (int i=1;i<=q;i++) cout<<ans[i]<<' ';
	cout<<'\n';
}
signed main(){
	int T=read();
	while (T--){
		solve();
	}
	return 0;
}
2024/3/16 11:14
加载中...