제출 #1092696

#제출 시각아이디문제언어결과실행 시간메모리
1092696De3b0oSum Zero (RMI20_sumzero)C++17
22 / 100
72 ms23532 KiB
#include<bits/stdc++.h>
#include<random>
#define ll long long
#define F first
#define S second
#define in insert
#define pb push_back
#define ppb pop_back()
#define d3 ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define cans cout << ans << "\n";
#define yes cout << "Yes" << "\n";
#define no cout << "No" << "\n";
#define pll pair<ll,ll>
#define lin cout << "\n";
#define sqr 340
#define mod 1000000007
#define mid ((l+r)/2)
#define lc (2*x)
#define rc (2*x+1)

using namespace std;

const ll N = 400009;

ll n , q;
ll a[N];
ll p[N];
map<ll,ll> mp;
ll idx[N];
ll id[N];
ll b[N][20];

int main()
{
    d3
    cin >> n;
    for(int i = 1 ; n>=i ; i++)
    {
        cin >> a[i];
        p[i]=p[i-1]+a[i];
    }
    for(int i = 1 ; n>=i ; i++)
        id[i]=n+1;
    mp[0]=0;
    for(ll i = 1 ; n>=i ; i++)
    {
        idx[i]=-1;
        if(mp[p[i]]==0&&p[i]!=0)
        {
            mp[p[i]]=i;
            continue;
        }
        idx[i]=mp[p[i]]+1;
        mp[p[i]]=i;
        id[idx[i]]=min(id[idx[i]],i);
    }
    ll mn = n+1;
    for(int i = n ; i>0 ; i--)
    {
        mn=min(mn,id[i]);
        b[i][0]=mn;
    }
    for(int j = 0 ; 20>j ; j++)
        b[n+1][j]=n+1;
    for(int j = 1 ; 20>j ; j++)
    {
        for(int i = 1 ; n>=i ; i++)
        {
            b[i][j]=b[b[i][j-1]+1][j-1];
            if(b[i][j]==0)
                b[i][j]=n+1;
        }
    }
    cin >> q;
    while(q--)
    {
        ll l , r;
        cin >> l >> r;
        ll ans = 0;
        ll i = l;
        for(int j = 19 ; j>=0 ; j--)
        {
            if(i>r)
                break;
            if(b[i][j]>r)
                continue;
            ans+=(1<<j);
            i=b[i][j]+1;
        }
        cans
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...