main = do n <- readLn :: IO Integer q <- readLn :: IO Integer qs <- map words . lines <$> getContents mapM_ print (process qs) process :: [[String]] -> [Integer] process = reverse . fst . foldl exec ([],(x,y)) a :: [Integer] -> [Integer] -> Int -> Integer a x y 0 = 1 a x y i = (x !! (i-1)) * (b x y (i-1))^2 + a x y (i-1) b :: [Integer] -> [Integer] -> Int -> Integer b x y 0 = 1 b x y i = (y !! (i-1)) * b x y (i-1) + 1 x :: [Integer] x = repeat 0 y :: [Integer] y = repeat 0 exec :: ([Integer],([Integer],[Integer])) -> [String] -> ([Integer],([Integer],[Integer])) exec (acc,(xn,yn)) q = case q of ["x",i,v] -> (acc, (replace (read i) (read v) xn, yn)) ["y",i,v] -> (acc, (xn, replace (read i) (read v) yn)) ["a",i] -> (a xn yn (read i) `mod` (10^9+7) : acc, (xn,yn)) replace :: Int -> Integer -> [Integer] -> [Integer] replace i v xs = let (x1,(_:x2)) = splitAt i xs in x1 ++ [v] ++ x2