Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- const int inf_int=1e9+100;
- const ll inf_ll=1e16;
- typedef pair<int,int> pii;
- typedef pair<ll,ll> pll;
- typedef long double dbl;
- #define pb push_back
- const double pi=3.1415926535898;
- #define dout if(debug) cout
- #define fi first
- #define se second
- #define sp setprecision
- #define sz(a) (int(a.size()))
- #define all(a) a.begin(),a.end()
- bool debug = 0;
- const int MAXN = 1<<18;
- const int LOG = 20;
- const ll mod =998244353;
- const int MX_LEVEL = 1<<9;
- int n,q;
- int a[MAXN];
- int ans[MX_LEVEL][MAXN];
- int STAR_BIT[MAXN];
- int get(int i,int level){
- if(level < MX_LEVEL){
- return ans[level][i];
- }
- int BIT = STAR_BIT[level];
- int res = get(i, level ^ (1<<BIT));
- int to = i + (1<<BIT);
- if( to < n){
- res = res ^ get(to, level ^ (1 << BIT));
- }
- return res;
- }
- void solve(){
- cin >> n;
- cin >> q;
- for(int i=0;i<n;++i){
- cin >> a[i];
- ans[0][i] = a[i];
- }
- for(int i=0;i<MAXN;++i){
- for(int j = 0;j < 20;++j){
- if(i&(1<<j)){
- STAR_BIT[i] = j;
- }
- }
- }
- for(int level = 1;level < (MX_LEVEL); ++level){
- int BIT = STAR_BIT[level];
- int next_level = level ^ (1<<BIT);
- int add = (1<<BIT);
- for(int i=0;i<n;++i){
- ans[level][i] = ans[next_level][i];
- int to = i + add;
- if(to<n){
- ans[level][i]^=ans[next_level][to];
- }
- }
- }
- while(q--){
- int k,x;
- cin >> k >> x;
- k = k % MAXN;
- cout << get(x-1,k)<<"\n";
- }
- }
- signed main()
- {
- #ifdef zxc
- debug = 1;
- freopen("input.txt","r",stdin);
- //freopen("output1.txt","w",stdout);
- #else
- #endif //zxc
- ios_base::sync_with_stdio(0);
- cin.tie(0); cout.tie(0);
- cout.setf(ios::fixed);
- cout.precision(20);
- int t = 1;
- while(t--)
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement