#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define ld long double
#define ull unsigned long long
#define ff first
#define ss second
#define pii pair<int,int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vl vector<long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;
//mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());}
//ll los(ll a, ll b) {return a + (mt() % (b-a+1));}
const int INF = 1e9+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;
int main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//random_start();
int n,t;
cin >> n >> t;
vi arr(n+1);
vi arr2(n+1);
rep(i,n) cin >> arr[i+1];
rep2(i,1,n) arr2[i] = arr[i];
vector<pii> ans;
if(t == 1)
{
vector<pii> sort_arr;
rep(i,n) sort_arr.pb({-arr[i+1],i+1});
sort(all(sort_arr));
rep(i,n)
{
rep2(j,1,n-1-i)
{
ans.pb({j,j+1});
arr[j] ^= arr[j+1];
}
pii m = {-1,-1};
rep2(j,1,n-i)
{
m = max(m,{arr2[j],j});
}
int x = m.ss;
// cout << x << " x\n";
// rep2(k,1,n) cout << arr[k] << " ";
// cout << " arr\n";
rep2(j,x,n-1-i)
{
ans.pb({j+1,j});
arr[j+1] ^= arr[j];
}
for(int j = x-2; j >= 1; j--)
{
ans.pb({j,j+1});
arr[j] ^= arr[j+1];
}
rep2(i,x,n-1)
{
arr2[i] = arr2[i+1];
}
// rep2(k,1,n) cout << arr[k] << " ";
// cout << " arr\n";
// cout << "\n";
}
for(int i = n-1; i >= 1; i--)
{
ans.pb({i,i+1});
arr[i] ^= arr[i+1];
}
// rep2(k,1,n) cout << arr[k] << " ";
// cout << " arr\n";
}
if(t == 2)
{
int cur_suf = n;
for(int bit = 19; bit >= 0; bit--)
{
bool was = false;
rep2(i,1,cur_suf)
{
if(arr[i] & (1 << bit))
{
was = true;
int cur = i-1;
while(cur >= 1 && (arr[cur] & (1 << bit)) == 0)
{
ans.pb({cur,cur+1});
arr[cur] ^= arr[cur+1];
cur--;
}
cur = i+1;
while(cur <= cur_suf && (arr[cur] & (1 << bit)) == 0)
{
ans.pb({cur,cur-1});
arr[cur] ^= arr[cur-1];
cur++;
}
}
}
if(was == true)
{
rep2(i,2,cur_suf)
{
ans.pb({i-1,i});
arr[i-1] ^= arr[i];
}
cur_suf--;
}
// rep2(i,1,n) cout << arr[i] << " ";
// cout << " arr\n";
}
}
cout << siz(ans) << "\n";
forall(it,ans) cout << it.ff << " " << it.ss << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |