Submission #715627

# Submission time Handle Problem Language Result Execution time Memory
715627 2023-03-27T10:40:22 Z boris_mihov Horses (IOI15_horses) C++17
37 / 100
197 ms 70880 KB
#include "horses.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>

typedef long long llong;
const int MAXN = 500000 + 10;
const int MOD = 1e9 + 7;

struct Node
{
    __int128 ans;
    __int128 prodX;
    bool isANSbig;
    bool isXbig;

    inline friend Node operator + (Node left, Node right)
    {
        Node res;
        res.prodX = left.prodX * right.prodX;
        if (res.prodX >= 1LL * MOD * MOD)
        {
            res.isXbig = true;
            res.prodX %= 1LL * MOD * MOD;
        } else
        {
            res.isXbig = left.isXbig || right.isXbig;
        }
        
        if (left.isXbig || right.isANSbig || (left.ans < left.prodX * right.ans))
        {
            res.ans = left.prodX * right.ans;
            if (res.ans >= 1LL * MOD * MOD || left.isXbig || right.isANSbig)
            {
                res.isANSbig = true;
                res.ans %= 1LL * MOD * MOD; 
            }
        } else
        {
            res.ans = left.ans;
            res.isANSbig = left.isANSbig;
        }

        return res;
    }
};

int n;
int x[MAXN];
int y[MAXN];
struct SegmentTree
{
    Node tree[4 * MAXN];
    void build(int l, int r, int node)
    {
        if (l == r)
        {
            tree[node].prodX = x[l];
            tree[node].isXbig = false;
            tree[node].isANSbig = false;
            tree[node].ans = 1LL * x[l] * y[l];
            return;
        }

        int mid = (l + r) / 2;
        build(l, mid, 2*node);
        build(mid + 1, r, 2*node + 1);
        tree[node] = tree[2*node] + tree[2*node + 1];
    }

    void update(int l, int r, int node, int queryIdx, int queryVal, bool which)
    {
        if (l == r)
        {
            if (!which) x[l] = queryVal;
            else y[l] = queryVal;
            tree[node].ans = 1LL * x[l] * y[l];
            tree[node].prodX = x[l];
            return;
        }

        int mid = (l + r) / 2;
        if (queryIdx <= mid) update(l, mid, 2*node, queryIdx, queryVal, which);
        else update(mid + 1, r, 2*node + 1, queryIdx, queryVal, which);
        tree[node] = tree[2*node] + tree[2*node + 1];
    }

    inline int getANS()
    {
        return tree[1].ans % MOD;
    }

    void build()
    {
        build(1, n, 1);
    }

    void update(int idx, int val, bool which)
    {
        update(1, n, 1, idx, val, which);
    }
};

SegmentTree tree;
int init(int N, int X[], int Y[]) 
{
    n = N;
    for (int i = 1 ; i <= n ; ++i)
    {
        x[i] = X[i - 1];
        y[i] = Y[i - 1];
    }

    tree.build();
	return tree.getANS();
}

int updateX(int pos, int val) 
{
    pos++;
    tree.update(pos, val, false);
	return tree.getANS();
}

int updateY(int pos, int val) 
{
    pos++;
    tree.update(pos, val, true);
	return tree.getANS();
}

Compilation message

horses.cpp: In member function 'int SegmentTree::getANS()':
horses.cpp:91:28: warning: conversion from '__int128' to 'int' may change value [-Wconversion]
   91 |         return tree[1].ans % MOD;
      |                ~~~~~~~~~~~~^~~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 0 ms 212 KB Output is correct
11 Correct 0 ms 212 KB Output is correct
12 Correct 0 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 0 ms 212 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 0 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 0 ms 212 KB Output is correct
11 Correct 0 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 0 ms 212 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 0 ms 212 KB Output is correct
21 Correct 0 ms 212 KB Output is correct
22 Incorrect 1 ms 212 KB Output isn't correct
23 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 107 ms 58280 KB Output is correct
2 Correct 197 ms 70880 KB Output is correct
3 Correct 151 ms 62084 KB Output is correct
4 Correct 170 ms 65908 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 256 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 1 ms 296 KB Output is correct
10 Correct 0 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 0 ms 212 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 1 ms 212 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 0 ms 212 KB Output is correct
22 Incorrect 0 ms 212 KB Output isn't correct
23 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 0 ms 212 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 0 ms 212 KB Output is correct
22 Incorrect 1 ms 312 KB Output isn't correct
23 Halted 0 ms 0 KB -