模拟赛题求调
  • 板块题目总版
  • 楼主lcfollower
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/3 12:30
  • 上次更新2024/10/3 14:12:08
查看原帖
模拟赛题求调
1296826
lcfollower楼主2024/10/3 12:30

rt

input :
3
5
15 14 17 42 34
3
1 7
2 15
4 5
5
7 5 3 1 7
4
1 7
5 7
2 3
2 2
7
19 20 15 12 21 7 11
4
1 15
4 4
7 12
5 7
output:
2 -1 5
1 5 2 2
2 6 -1 5

# include <bits/stdc++.h>

//# define int long long
# define rint register int
# define up(i ,x, y) for(rint i = x; i <= y ; i ++)
# define dn(i ,x ,y) for(rint i = x; i >= y ;i --)

inline int read ();
inline void write (int x);
inline void writesp (int x);
inline void writeln (int x);

using namespace std;

const int N = 1e5 + 10;
int n ,a[N] ,pre[N];

inline void fre (){
  freopen ("and.in" ,"r" ,stdin);
  freopen ("and.out", "w" ,stdout);
} struct segment_tree{int l ,r, ands;}tr[N << 2];
inline void pushup(int u){
  tr[u].ands = (tr[u << 1].ands & tr[u << 1 | 1].ands);
}inline void build (int u ,int L ,int R){
  tr[u].l = L ,tr[u].r = R;
  if(L == R) {tr[u].ands = a[L] ; return ;}
  int mid = ((L + R) >> 1ll);
  build (u << 1 ,L ,mid);
  build (u << 1 | 1 ,mid + 1, R);
  pushup(u);
} inline int query (int u ,int L ,int R){
  int l = tr[u].l ,r = tr[u].r;
  if(l >= L && r <= R) return tr[u].ands;
  int mid = ((l + r) >> 1ll) ,ans = 0;
  if(L <= mid) ans = query (u << 1 ,L ,R);
  if(mid < R){
  	if(!ans) ans = query(u << 1 | 1 ,L ,R);
  	else ans &= query (u << 1 | 1 ,L , R);
  }
  return ans; 
} inline void solve (){
  n = read ();
  up(i, 1, n) a[i] = read ();
  build (1 ,1, n);
  int Q = read ();
  while(Q --){
  	int lft = read () , k = read () ,l = lft ,r = n ,res = 0;
  	while(l <= r){
  	  int mid = ((l + r) >> 1ll);
	  if(query (1 ,lft ,mid) < k) r = mid - 1;
	  else l = mid + 1 ,res = mid;
	} if(!res) writesp(-1) ; else writesp(res);
  } puts("");
} signed main(){
//  fre ();
  int _ = read ();
  while (_ --) solve (); 
  return 0;
}

/*
3
7
19 20 15 12 21 7 11
4
1 15
4 4
7 12
5 7
5
15 14 17 42 34
3
1 7
2 15
4 5
5
7 5 3 1 7
4
1 7
5 7
2 3
2 2

*/



inline int read (){
  int s = 0;bool w = 0 ;char c = getchar ();
  while(!isdigit(c)){
  	w |= (c == '-');
  	c = getchar ();
  } while (isdigit (c)){
  	s = (s << 1 ) + (s << 3) + (c ^ 48);
  	c = getchar ();
  } return w ? -s : s;
} inline void write(int x){
  if(x < 0) x = -x ,putchar ('-');
  if(x > 9) write(x / 10);
  putchar (x % 10 | 48);
} inline void writesp(int x){
  write (x) ,putchar (' ');
} inline void writeln(int x){
  write (x) ,putchar ('\n');
}
2024/10/3 12:30
加载中...