제출 #944978

#제출 시각아이디문제언어결과실행 시간메모리
944978vjudge1Sum Zero (RMI20_sumzero)C++11
61 / 100
219 ms23632 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxN  = 5e5 + 5;

long long query[maxN];
long long get_l(const long long &num)
{
    return num & ((1LL << 19) - 1LL);
}
long long get_r(const long long &num)
{
    return (num >> 19) & ((1LL << 19) - 1LL);
}
long long get_idx(const long long &num)
{
    return (num >> 38) & ((1LL << 19) - 1LL);
}

bool cmp_query(const long long &a, const long long &b)
{
    return get_l(a) > get_l(b);
}

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

stack<int> S;
int lq[maxN], val[maxN];
int last_l, tr, pr;

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;
    val[0] = 0;
    for(int i = 1; i <= n; ++i)
    {
        cin >> re[i];
        lq[i] = i;
        val[i] = 0;
    }

    cin >> q;
    long long l, r, idx;
    for(int i = 1; i <= q; ++i)
    {
        cin >> l >> r;
        idx = i;
        query[i] = l | (r << 19) | (idx << 38);
    }
    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)
    {
        sum += re[i];
        re[i] = -1;
        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 >= get_l(query[i]))
        {
            if(re[itl] != -1)
            {
                //calc(itl, re[itl]);
                tr = re[itl];
                while(itl <= tr)
                {
                    if(val[tr])last_l = lq[tr];
                    S.push(tr);
                    tr = lq[tr] - 1;
                }
                pr = itl - 1;
                while(!S.empty())
                {
                    val[S.top()] += val[pr];
                    lq[S.top()] = (val[S.top()] ? last_l : itl);
                    pr = S.top();
                    S.pop();
                }

                if(!val[re[itl]])
                {
                    val[re[itl]] = 1;
                    lq[re[itl]] = itl;
                    for(int j = re[itl] + 1; j <= n; ++j)
                        if(val[j])break;
                        else lq[j] = re[itl] + 1;
                }
            }
            itl--;
        }

        tr = get_r(query[i]);
        while(get_l(query[i]) <= tr)
        {
            if(val[tr])last_l = lq[tr];
            S.push(tr);
            tr = lq[tr] - 1;
        }
        pr = get_l(query[i]) - 1;
        while(!S.empty())
        {
            val[S.top()] += val[pr];
            lq[S.top()] = (val[S.top()] ? last_l : get_l(query[i]));
            pr = S.top();
            S.pop();
        }

        res[get_idx(query[i])] = val[get_r(query[i])];
    }
    for(int i = 1; i <= q; ++i)
        cout << res[i] << '\n';

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

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