求助,判断-1出现问题
查看原帖
求助,判断-1出现问题
481851
Withers楼主2022/9/24 23:39
#include<bits/stdc++.h>
//#include<bits/extc++.h>
#define Withers using
#define AK namespace
#define IOI std;
//#define ACM __gnu_pbds 
Withers AK IOI;
//Withers AK ACM;
//#define int long long
typedef long long ll;
typedef pair<int,int> pii;
//typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> Tree;
int n,m,u,w,x,y,z,l,r,minn=INT_MAX,maxx=INT_MIN,k;
int tst;
int a[500010];
char s[500010];
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
char t[500010];
#define infll 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define endl '\n'
static char buf[1<<18],*paa=buf,*pddd=buf;
static char buf2[1<<18],*pppp=buf2;
#define getchar() paa==pddd&&(pddd=(paa=buf)+fread(buf,1,1<<18,stdin),paa==pddd)?EOF:*paa++
inline void pc(char ch){
	if(pppp-buf2==1<<18) fwrite(buf2,1,1<<18,stdout),pppp=buf2;
	*pppp++=ch;
}
inline void pcc(){
	fwrite(buf2,1,pppp-buf2,stdout);
	pppp=buf2;
}
inline void rd(int &n){
	int w=1;
	register int x(0);register char c(getchar());
	while(c<'0'||c>'9'){if(c=='-') w=-1;c=getchar();}
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
	n=w*x;return;
}
inline void write(int x){
	if(x<0) pc('-'),x=-x;
	static int sta[20];int top=0;
	do{sta[top++]=x%10,x/=10;}while(x);
	while(top) pc(sta[--top]+48);
}
inline void we(int x){
	write(x);
	pc('\n');
}
inline void ws(int x){
	write(x);
	pc(' ');
}
#define deb(x) cout<<#x<<"="<<x<<" ";
#define pb push_back
#define fi first
#define se second
#define mx3(a,b,c) ((a>b?a:b)>c?(a>b?a:b):c)
#define mn3(a,b,c) ((a<b?a:b)<c?(a<b?a:b):c)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=a;i<=b;i++)
void rd(int n,int a[]){for(int i=1;i<=n;i++) rd(a[i]);}
void rda(){rd(n);for(int i=1;i<=n;i++) rd(a[i]);}
int get(char s[])
{
	char ch='=';
	int cnt=0;
	int len=strlen(s+1);
	for(int i=1;i<=len;i++) s[i]=0;
	while(!((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))) ch=getchar();
	while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')) s[++cnt]=ch,ch=getchar();
	return cnt;
}
void put(char s[])
{
	int len=strlen(s+1);
	for(int i=1;i<=len;i++) pc(s[i]);
}
void get(string &s)
{
	s="";
	char ch='=';
	while(!((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))) ch=getchar();
	while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')) s.push_back(ch),ch=getchar();
	return;
}
void put(string s)
{
	int len=s.size();
	for(int i=0;i<len;i++) pc(s[i]);
}
void file(string s)
{
	freopen((s+".in").c_str(),"r",stdin);
	freopen((s+".out").c_str(),"w",stdout);
}
int b[500010];
inline int get(int x){return std::lower_bound(b+1,b+k+1,x)-b;}
vector<int> g[500010];
void adde(vector<pii> g[],int x,int y,int z){g[x].push_back({y,z});g[y].push_back({x,z});}
namespace dsu
{
	int fa[500010];
	void init(int n) {for(int i=1;i<=n;i++) fa[i]=i;}
	int find(int x){
    if(x==fa[x])return x;
    else return fa[x]=find(fa[x]);}
	void merge(int x,int y){int fx=find(x),fy=find(y);if(fx!=fy){fa[fx]=fy;}};
};
const int N=500010;
struct pp
{
	int l,r,sum;
} tr[N<<5];
int cntt;
int rt[N];
inline void insert(int l,int r,int pre,int &now,int p)
{
	tr[++cntt]=tr[pre];
	now=cntt;
	tr[now].sum++;
	if(l==r) return;
	int mid=(l+r)>>1;
	if(p<=mid) insert(l,mid,tr[pre].l,tr[now].l,p);
	else insert(mid+1,r,tr[pre].r,tr[now].r,p);
}
inline int query(int l,int r,int L,int R,int k)
{
	if(l==r) return l;
	int tmp=tr[tr[R].r].sum-tr[tr[L].r].sum;
	int mid=(l+r)>>1;
	if(k<=tmp) return query(mid+1,r,tr[L].r,tr[R].r,k);
	else return query(l,mid,tr[L].l,tr[R].l,k-tmp);
}
const int MXLG=20;
int f[500010][23];
int d[500010];
int num=0;
int L[500010],R[500010];
int in[500010];
void dfs(int x)
{
	for(int i=1;i<=MXLG;i++) f[x][i]=f[f[x][i-1]][i-1];
	L[x]=num;
	if(x<=n)
	{
		int tmp=get(a[x]);
		L[x]=++num;
		insert(1,k,rt[num-1],rt[num],tmp);
		return;
	}
	for(auto i:g[x]) dfs(i);
	R[x]=num;
}
int lca(int x,int y)
{
	if(d[x]<d[y]) swap(x,y);
	for(int i=MXLG;i>=0;i--)
	{
		if(d[f[x][i]]>=d[y]) x=f[x][i];
		if(d[x]==d[y]) break;
	}
	if(x==y) return x;
	for(int i=MXLG;i>=0;i--)
	{
		if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	}
	return f[x][0];
}
using namespace dsu;
int v[500010];
struct p
{
	int from,to,v;
} e[500010];
bool cmp(p m,p n){return m.v<n.v;}
int cnt=0;
void kruscal()
{
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		int p=e[i].from,q=e[i].to;
		int fx=find(p),fy=find(q);
		if(fx!=fy)
		{
			++cnt;
			fa[cnt]=fa[fx]=fa[fy]=cnt;
			f[fx][0]=f[fy][0]=cnt;
			in[fx]++;in[fy]++;
			g[cnt].pb(fx);
			g[cnt].pb(fy);v[cnt]=e[i].v;
		}
	}
	for(int i=1;i<=cnt;i++) reverse(g[i].begin(),g[i].end());
	for(int i=1;i<=cnt;i++) if(!f[i][0]) dfs(i);
}
void solve()
{
	//do something
	int q;
	rd(n);rd(m);rd(q);
	for(int i=1;i<=n;i++) rd(a[i]),b[i]=a[i];
	std::sort(b+1,b+n+1);
	k=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=m;i++)
	{
		rd(e[i].from),rd(e[i].to),rd(e[i].v);
	}
	cnt=n;
	dsu::init(n);
	kruscal();
	int lst=0;
	while(q--)
	{
		int x,dd,kk;
		rd(x);rd(dd);rd(kk);
		x=(x^lst)%n+1;
		kk=(kk^lst)%n+1;
		dd^=lst;
		for(int i=20;i>=0;i--)
		{
			if(f[x][i]&&v[f[x][i]]<=dd) x=f[x][i];
		}
		if(tr[rt[R[x]]].sum-tr[rt[L[x]]].sum<kk) {cout<<-1<<endl;lst=0;} 
        else cout<<(lst=b[query(1,k,rt[L[x]],rt[R[x]],kk)])<<endl;
	}
}
void multi()
{
	//rd(tst);
	tst=1;
	while(tst--)
	{
		solve();
	}
	pcc();
}
signed main()
{
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	multi();
}
// POWERED BY WITHERS
// THINK ONCE, CODE TWICE
/*things to check
1.  int overflow or long long memory need
2.  recursion/array/binary search/dp/loop bounds
3.  precision
4.  special cases(n=1,bounds)
5.  delete debug statements
6.  initialize(especially multi-tests)
7.  = or == , n or m ,++ or -- , i or j , > or >= , < or <= , - or =
8.  keep it simple and stupid
9.  do not delete, use // instead
10. operator priority
11. is there anything extra to output?
12. if you don't know where the bug is , try to clear some parts of the code
 and check each part seperately.
13. ...
*/
 
/* something to think about
1. greedy? dp? searching? dp with matrix/ segment tree? binary search?
2. If contains "not", why not 正难则反 or few affect?
*/
2022/9/24 23:39
加载中...