이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define f first
#define s second
#define pb push_back
#define all(x) x.begin(),x.end()
#define vi vector<int>
#define vvi vector<vi>
#define vp vector<pii>
using namespace std;
const int N=4e5+5;
int le,re,m,hc,hv;
vector<int>g[N];
bool vis[N]{0};
int sz[N]{0},head[N]{0},pr[N]{0},id[N]{0},rid[N]{0},cur=0;
void dfs(int u,int p){
sz[u]=1;pr[u]=p;
for(auto v:g[u]){
if(v==p)continue;
dfs(v,u);sz[u]+=sz[v];
}
}
void hld(int u,int p,int tp){
head[u]=tp;id[u]=++cur;rid[cur]=u;
hv=-1,hc=-1;
for(auto v:g[u]){
if(v==p)continue;
if(sz[v]>hc)hc=sz[v],hv=v;
}if(hv==-1)return;
hld(hv,u,tp);
for(auto v:g[u]){
if(v==p||v==hv)continue;
hld(v,u,v);
}
}
int qr(int l,int r,int res=0){
while(l<=r){
if(pr[head[l]]<=r){
res+=id[l]-id[head[l]]+1;
l=pr[head[l]];
}
else {
le=id[head[l]],re=id[l];
while(le<re){
m=(le+re)>>1;
if(rid[m]<=r)re=m;
else le=m+1;
}res+=id[l]-le;break;
}
}return res;
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
int n;cin>>n;
int a[n+1];
for(int i=1;i<=n;i++)cin>>a[i];
unordered_map<int,int>um;int sum=0;
int id=0;um[0]=0;
for(int i=1;i<=n;i++){
sum+=a[i];
if(um.find(sum)!=um.end()){
while(id<=um[sum])g[i].pb(id),vis[id++]=1;
}um[sum]=i;
}
for(int i=0;i<=n;i++)if(!vis[i])g[n+1].pb(i);
dfs(n+1,n+1);hld(n+1,n+1,n+1);
int q,l,r;cin>>q;
while(q--){
cin>>l>>r;l--;
cout<<qr(l,r)<<'\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |