//============================================================================
// Name        : filename.cpp
// Author      : abb
// Version     :
// Copyright   : [My copyright notice]
// Description : test program
//============================================================================

/*
A - ><

実行時間制限: 2 sec / メモリ制限: 1024 MB

配点 : 300 点

問題文
長さ N-1 の文字列 S が与えられます．
S の各文字は '<' または '>' です．
長さ N の非負整数列 a_1, a_2, \cdots, a_N は，
すべての i (1 <= i <= N-1) について次の条件をみたす時，良い非負整数列と呼ばれます．

・S_i= '<' のとき： a_i<a_{i+1}
・S_i= '>' のとき： a_i>a_{i+1}

良い非負整数列の要素の総和としてありうる最小の値を求めてください．

制約

・2 <= N <= 5 × 10^5
・S は '<' と '>' のみから成る長さ N-1 の文字列．
 */

#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ull = unsigned long long;

#define REP(i, m, n) for (int i = m; i < (int)(n); ++(i))
#define ALL(x) begin(x), end(x)

ll calc(ll dec_count, ll inc_count, ll previous_section_last_height)
{
    // dec = 1 なら 1, dec = 2 なら 1 + 2, ...
    ll sum_tmp = (dec_count * (dec_count + 1)) / 2 + (inc_count * (inc_count + 1)) / 2 - dec_count;
    // 前のセクションとの境界はダブっているので考える (大きい方を採用)
    // → もし dec_count のほうが大きいなら previous_section_last_height との差分を足す
    if (dec_count > previous_section_last_height)
    {
        sum_tmp += dec_count - previous_section_last_height;
    }
    return sum_tmp;
}

/**
 * エントリポイント．
 * 最小になるところで 0 になればよい．
 * つまり， >>><<< のように 「下り→上り」でワンセットに考え，ここの部分の部分和を考えて
 * それを全部足せばよい．ただし境界部は注意．
 * 前の境界部が小さすぎると，これ以上下れないという状況が発生するので，その時は補正する．
 * @return 0.
 */
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    const char inc = '<';
    const char dec = '>';

    string s;
    cin >> s;
    ll sum_all = 0;
    ll previous_section_last_height = 0;
    char last_sign = inc; // ループの前の段階の記号
    bool first = true;
    ll dec_count = 0; // セクション内で下った回数
    ll inc_count = 0; // セクション内で登った回数
    for (char c : s)
    {
        if (first)
        {
            // 新たなシーケンスの始まり
            first = false;
            if (c == dec)
            {
                // cerr << c << "新たなシーケンスの始まり (減少開始)" << endl;
                ++dec_count;
            }
            else
            {
                // cerr << c << "新たなシーケンスの始まり (増加開始)" << endl;
                ++inc_count;
            }
        }
        else if (last_sign == inc && c == dec)
        {
            // 新たなシーケンスの始まり
            // cerr << c << "新たなシーケンスの始まり (増加から減少に転じる)" << endl;
            // TODO: 前のシーケンスの精算
            ll sum_tmp = calc(dec_count, inc_count, previous_section_last_height);
            sum_all += sum_tmp;
            previous_section_last_height = inc_count;
            dec_count = 1;
            inc_count = 0;
        }
        else if (last_sign == inc)
        { // c == inc
            // 増加途中
            // cerr << c << "増加途中" << endl;
            ++inc_count;
        }
        else if (c == dec)
        { // last_sign == dec
            // 減少途中
            // cerr << c << "減少途中" << endl;
            ++dec_count;
        }
        else
        { // last_sign == dec && c == inc
            // 減少から増加に転じる
            // cerr << c << "減少から増加に転じる" << endl;
            ++inc_count;
        }
        last_sign = c;
    }
    if (dec_count != 0 || inc_count != 0)
    {
        ll sum_tmp = calc(dec_count, inc_count, previous_section_last_height);
        sum_all += sum_tmp;
    }
    cout << sum_all << endl;
    return 0;
}


Measured memory_bytes: 1172