Cod sursă (job #543068)

Utilizator avatar BigBoss_29 Name Name BigBoss_29 IP ascuns
Problemă Sam (Lot Juniori) Compilator cpp | 2,27 kb
Rundă lasm_13_03_2020_cl_12c_a Status evaluat
Dată 13 mar. 2020 18:06:00 Scor 0
#include <fstream>
#include <algorithm>
 using namespace std;
ifstream in ( "sam.in"  );
ofstream out( "sam.out" );
 
const int DIM = 3 + 5;
const int MOD = 1e6 + 3;
 
pair<int, int> sgt[2][DIM * 4];
 
inline int f( int x ) {
    return ( x < MOD ) ? x : ( x - MOD ); }
 
pair<int, int> update( int k, int n, int l, int r, int p, pair<int, int> v ) {
    if( l > r || l > p || p > r ) {
        return sgt[k][n]; }
    if( l == p && r == p ) {
        sgt[k][n] = v; return sgt[k][n]; }
    int m = l + ( r - l ) / 2;
    pair<int, int> ans1 = update( k, n * 2, l, m, p, v );
    pair<int, int> ans2 = update( k, n * 2 + 1, m + 1, r, p, v );
    sgt[k][n].first = max( ans1.first, ans2.first ); sgt[k][n].second = 0;
    if( sgt[k][n].first == ans1.first ) {
        sgt[k][n].second = f( sgt[k][n].second + ans1.second ); }
    if( sgt[k][n].first == ans2.first ) {
        sgt[k][n].second = f( sgt[k][n].second + ans2.second ); }
    return sgt[k][n]; }
 
pair<int, int> query( int k, int n, int l, int r, int st, int fi ) {
    if( l > r || l > fi || st > r ) {
        return make_pair( 0, 0 ); }
    if( st <= l && r <= fi ) {
        return sgt[k][n]; }
    int m = l + ( r - l ) / 2; pair<int, int> ans;
    pair<int, int> ans1 = query( k, n * 2, l, m, st, fi );
    pair<int, int> ans2 = query( k, n * 2 + 1, m + 1, r, st, fi );
    ans.first = max( ans1.first, ans2.first ); ans.second = 0;
    if( ans.first == ans1.first ) {
        ans.second = f( ans.second + ans1.second ); }
    if( ans.first == ans2.first ) {
        ans.second = f( ans.second + ans2.second ); }
    return ans; }
 
int main() {
    ios::sync_with_stdio( false );
    int n, ans = 0, maxim = 0; in >> n;
    for( int i = 1; i <= n; i ++ ) {
        pair<int, int> ans1, ans2; int x; in >> x;
        ans1 = query( 1, 1, 1, n, x + 1, n );
        if( ans1.second == 0 ) { ans1.second ++; }
        ans1.first ++; update( 0, 1, 1, n, x, ans1 );
        ans2 = query( 0, 1, 1, n, 1, x - 1 );
        if( ans2.second == 0 ) { ans2.second ++; }
        ans2.first ++; update( 1, 1, 1, n, x, ans2 ); }
    maxim = max( sgt[0][1].first, sgt[1][1].first );
    if( maxim == sgt[0][1].first ) { ans = f( ans + sgt[0][1].second ); }
    if( maxim == sgt[1][1].first ) { ans = f( ans + sgt[1][1].second ); }
    out << ans << endl;
    return 0; }