Submission #648008

#TimeUsernameProblemLanguageResultExecution timeMemory
648008mihneacazanSum Zero (RMI20_sumzero)C++17
22 / 100
155 ms22708 KiB
#include <bits/stdc++.h>
#define pb push_back
#define ppb pop_back
#define pf push_front
#define ppf pop_front
#define ll long long
#define zeros(x) ( (x ^ (x - 1)) & x )

using namespace std;
unsigned seed = chrono::system_clock::now().time_since_epoch().count();
mt19937 rng(seed);
#define rand() rng()
/*const long long mod = 998244353;
long long fct[200005],invfct[200005],inv[200005];
long long put2[200005];
long long lgput (long long a, long long exp)
{
    long long rz=1;
    while(exp)
        if(exp&1)
            exp^=1,rz=rz*1LL*a%mod;
        else
            exp>>=1,a=a*1LL*a%mod;
    return rz;
}
long long cmb (long long n, long long k)
{
    if(n<k || k<0 || n<0)
        return 0;
    return fct[n]*1LL*invfct[k]%mod*1LL*invfct[n-k]%mod;
}
void init ()
{
    inv[1]=fct[0]=fct[1]=invfct[0]=invfct[1]=put2[0]=1,put2[1]=2;
    for(long long i=2;i<=200000;++i)
        put2[i]=put2[i-1]*2LL%mod,inv[i]=(mod-mod/i)*1LL*inv[mod%i]%mod,fct[i]=i*1LL*fct[i-1]%mod,invfct[i]=inv[i]*1LL*invfct[i-1]%mod;
}
long long v[200005];*/
const int N=4e5+5;
map<ll,int> last;
int dp[N],a[N];
vector<int> v[N];
void solve()
{
    int n;
    ll sum=0;
    cin>>n;
    for(int i=1; i<=n; i++)
        cin>>a[i];
    for(int i=0; i<=n+1; i++)
        dp[i]=-1;
    //for(int i=0;i<=n;i++)
    //   cout<<dp[i]<<" ";
    last[0]=n+1;
    for(int i=n; i>=1; i--)
    {
        sum+=a[i];
        //cout<<dp[i]<<" "<<last[sum]<<"\n";
        dp[i]=dp[i+1];
        if(last[sum] && (last[sum]-1<dp[i] || dp[i]==-1))
        {
            dp[i]=last[sum]-1;
            //cout<<"da ";
        }
        if(dp[i]!=-1)
            v[i].pb(dp[i]);
        //cout<<sum<<" "<<last[sum]<<"\n";
        last[sum]=i;
    }
    for(int i=1; i<=18; i++)
    {
        for(int j=1; j<=n; j++)
        {
            //dp[j][i]=dp[dp[j][i-1]+1][i-1];
            if(v[j].size()==i)
            {
                if(v[v[j][i-1]+1].size()==i)
                    v[j].pb(v[v[j][i-1]+1].back());
            }
        }
    }
    int q;
    cin>>q;
    while(q--)
    {
        int l,r,ans=0;
        cin>>l>>r;
        while(l<=r)
        {
            bool ok=0;
            for(int j=v[l].size()-1; j>=0; j--)
            {
                //cout<<l<<" "<<j<<" "<<v[l][j]<<"\n";
                //cout<<l<<" "<<j<<" "<<v[l][j]<<"\n";
                if(v[l][j]<=r)
                {
                    //cout<<l<<" "<<j<<" "<<v[l][j]<<"\n";
                    ans+=(1<<j);
                    ok=1;
                    l=v[l][j]+1;
                    break;
                }
            }
            if(!ok)
                break;
        }
        cout<<ans<<"\n";
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t=1;
    //cin>>t;
    while(t--)
        solve();
    return 0;
}

Compilation message (stderr)

sumzero.cpp: In function 'void solve()':
sumzero.cpp:75:27: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   75 |             if(v[j].size()==i)
      |                ~~~~~~~~~~~^~~
sumzero.cpp:77:41: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   77 |                 if(v[v[j][i-1]+1].size()==i)
      |                    ~~~~~~~~~~~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...