True/False Worksheet
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

Bob is completing a true/false worksheet, consisting of a list of n problems where each answer is either “true” or “false”. The problems are numbered from 1 to n. They are too hard for Bob, so the TA, Alice, has given Bob m hints. For each hint i, Alice gives Bob an (inclusive) range of questions [li , ri ], and tells him either “all answers in the range are the same” (in other words, either all are “true”, or all are “false”); or “not all of the answers in the range are the same.” Help Bob count how many different answer sequences satisfy the given hints. Since this number may be huge, print the answer modulo 109 + 7.

输入描述:

The first line of the input contains two space-separated integers n and m (1 ≤ n ≤5 000, 1 ≤ m ≤ 1 000 000), the number of problems and number of hints, respectively.The next m lines each encode a hint, and contain two space-separated integers li and ri (1 ≤ li ≤ ri ≤ n) followedby either the word same, if all answers in the range are the same, or different, if all answers in the range are notthe same (i.e., at least one answer is “true” and at least one other answer is “false”).

输出描述:

Print the number of different answer sequences satisfying all the hints, modulo 109 + 7. 
示例1

输入

复制
5 2
2 4 same
3 5 same

输出

复制
4
示例2

输入

复制
5 3
1 3 same
2 5 same
1 5 different

输出

复制
0