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.
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.
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.
3
1 2 3
2
1 2
2 3
odd
even
4
1 2 4 3
4
1 1
1 4
1 4
2 3
odd
odd
odd
even
The first example:
- after the first query a?=?[2,?1,?3], inversion: (2,?1);
- after the second query a?=?[2,?3,?1], inversions: (3,?1), (3,?2).
The second example:
- a?=?[1,?2,?4,?3], inversion: (4,?3);
- a?=?[3,?4,?2,?1], inversions: (3,?1), (4,?1), (3,?2), (4,?2), (4,?3);
- a?=?[1,?2,?4,?3], inversion: (4,?3);
- a?=?[1,?4,?2,?3], inversions: (3,?2), (4,?2).
题目分析 : 让你求一下再经过 m 次操作后,序列中的逆序数是多少,会发现一个规律, n 个数的序列中最多有逆序数 (n - 1) * n / 2 , 那么当你交换此序列的顺序后逆序数会变成 sum - 原有的逆序数 , 然后呢 再看此题,它就是让你判断一个奇偶性 ,可以借着此规律搞搞 就出来了
代码示例 :
#define ll long long int pre[1505]; int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); int n, m; int l, r; cin >> n; for(int i = 1; i <= n; i++){ scanf("%d", &pre[i]); } cin >> m; ll cnt = 0; for(int i = 1; i <= n; i++){ for(int j = 1; j < i; j++){ if (pre[i] < pre[j]) cnt++; } } for(int i = 1; i <= m; i++){ scanf("%d%d", &l, &r); int t = r - l + 1; int y = (t-1)*t/2; cnt += 1ll*y; if (cnt % 2 == 0) printf("even\n"); else printf("odd\n"); } return 0; }