D. Inversion Counting

D. Inversion Counting
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

A permutation of size n is an array of size n such that each integer from 1 to n occurs exactly once in this array. An inversion in a permutation p is a pair of indices (i, j) such that i > j and ai < aj. For example, a permutation [4, 1, 3, 2] contains 4 inversions: (2, 1), (3, 1), (4, 1), (4, 3).

You are given a permutation a of size n and m queries to it. Each query is represented by two indices l and r denoting that you have to reverse the segment [l, r] of the permutation. For example, if a = [1, 2, 3, 4] and a query l = 2, r = 4 is applied, then the resulting permutation is [1, 4, 3, 2].

After each query you have to determine whether the number of inversions is odd or even.

Input

The first line contains one integer n (1 ≤ n ≤ 1500) — the size of the permutation.

The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ n) — the elements of the permutation. These integers are pairwise distinct.

The third line contains one integer m (1 ≤ m ≤ 2·105) — the number of queries to process.

Then m lines follow, i-th line containing two integers li, ri (1 ≤ li ≤ ri ≤ n) denoting that i-th query is to reverse a segment [li, ri] of the permutation. All queries are performed one after another.

Output

Print m lines. i-th of them must be equal to odd if the number of inversions in the permutation after i-th query is odd, and even otherwise.

Examples
Input
3
1 2 3
2
1 2
2 3
Output
odd
even
Input
4
1 2 4 3
4
1 1
1 4
1 4
2 3
Output
odd
odd
odd
even

思路: 对【l,r】转置相当于对len/2对数进行交换,(交换奇数次奇偶性改变,交换偶数次不变) len = r - l + 1 
Code:
#include 
using namespace std;
const int AX = 1500 + 666;
int a[AX];
int main(){
	int n , q ;
	cin >> n;
	for( int i = 1 ; i <= n ; i++ ){
		cin >> a[i];
	}
	int cnt = 0;
	for( int i = 1 ; i <= n ; i++ ){
		for( int j = i + 1 ; j <= n ; j ++ ){
			if( a[j] < a[i] ){
				cnt ++ ;
			}
		}
	}
	cin >> q;
	int l , r;
	while( q-- ){
		cin >> l >> r;
		if( l == r ){
			cout << ( cnt % 2 == 0 ? "even" : "odd" ) << endl;
			continue;
		}
		int len = r - l + 1;
		len /= 2 ;
		int falg ;
		if( len % 2 == 1 ){
			if( cnt % 2 == 1 ){
				falg = 0;
				cnt = 0;
			}else{
				falg = 1;
				cnt = 1;
			}
		}else{
			if( cnt % 2 == 1 ){
				falg = 1;
				cnt = 1;
			}else{
				falg = 0;
				cnt = 0;
			}
		}
		cout << ( falg == 1 ? "odd" : "even" ) << endl;
	}
	return 0;
}


你可能感兴趣的:(数学-公式)