Submission #942661

#TimeUsernameProblemLanguageResultExecution timeMemory
942661vjudge1Sum Zero (RMI20_sumzero)C++17
61 / 100
229 ms26548 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxN  = 4e5 + 5;
long long arr[maxN];
struct query_info
{
    int l;
    int r;
    int idx;
} query[maxN];

bool cmp_query(const query_info &a, const query_info &b)
{
    return a.l > b.l;
}

map<long long, int> helper;
map<long long, int>::iterator m_iter;

int lq[maxN], val[maxN];
int last_l;
int calc(const int &l, const int &r)
{
    //cout << "Start " << l << ' ' << r << '\n';
    if(r < l)return 0;
    if(val[r])last_l = lq[r];
    val[r] = val[r] + calc(l, lq[r] - 1);
    lq[r] = (val[r] ? last_l : l);
    //cout << " Calc " << l << ' ' << r << ' ' << val[r] << '\n';
    return val[r];
}

int re[maxN];
int res[maxN];
int n, q;
int main()
{
    if(fopen("input.txt", "r"))
    {
        freopen("input.txt", "r", stdin);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n;
    for(int i = 1; i <= n; ++i)
    {
        cin >> arr[i];
        lq[i] = i;
        val[i] = 0;
    }

    cin >> q;
    for(int i = 1; i <= q; ++i)
    {
        cin >> query[i].l >> query[i].r;
        query[i].idx = i;
    }
    sort(query + 1, query + q + 1, cmp_query);

    helper.clear();
    helper.insert(make_pair(0LL, n + 1));
    long long sum = 0;
    for(int i = n; i > 0; --i)
    {
        re[i] = -1;
        sum += arr[i];
        m_iter = helper.find(sum);
        if(m_iter == helper.end())
        {
            helper.insert(make_pair(sum, i));
        }
        else
        {
            re[i] = m_iter->second - 1;
            m_iter->second = i;
        }
    }

    int itl = n;
    for(int i = 1; i <= q; ++i)
    {
        while(itl >= query[i].l)
        {
            if(re[itl] != -1)
            {
                calc(itl, re[itl]);
                if(!val[re[itl]])
                {
                    val[re[itl]] = 1;
                    lq[re[itl]] = itl;
                    calc(itl, re[itl]);
                    for(int j = re[itl] + 1; j <= n; ++j)
                        if(val[j])break;
                        else
                        {
                            lq[j] = re[itl] + 1;
                            //cout << "Set lq of " << j << " to " << re[itl] + 1 << '\n';
                        }

                }
            }
            itl--;
        }
        res[query[i].idx] = calc(query[i].l, query[i].r);
    }
    for(int i = 1; i <= q; ++i)
        cout << res[i] << '\n';

    return 0;
}

Compilation message (stderr)

sumzero.cpp: In function 'int main()':
sumzero.cpp:42:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   42 |         freopen("input.txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...