Submission #1327990

#TimeUsernameProblemLanguageResultExecution timeMemory
1327990SmuggingSpunSum Zero (RMI20_sumzero)C++20
22 / 100
74 ms12576 KiB
#include<bits/stdc++.h>
#define taskname "B"
using namespace std;
typedef long long ll;
const int lim = 1e5 + 5;
const int INF = 1e9 + 36;
int n, q, up[19][lim];
ll f[lim];
namespace sub1{
  void solve(){
    for(int _ = 0; _ < q; _++){
      int l, r;
      cin >> l >> r;
      r++;
      vector<ll>dp(n + 2, -INF);
      dp[l] = 0;
      for(int i = ++l; i <= r; i++){
        dp[i] = max(dp[i - 1], dp[up[0][i]] + 1);
      }
      cout << dp[r] << "\n";
    }
  }
}
namespace sub23{
  int st[lim << 2];
  void build(int id, int l, int r){
    if(l == r){
      st[id] = up[0][l];
      return;
    }
    int m = (l + r) >> 1;
    build(id << 1, l, m);
    build(id << 1 | 1, m + 1, r);
    st[id] = max(st[id << 1], st[id << 1 | 1]);
  }
  int get(int id, int l, int r, int u, int v){
    if(l > v || r < u){
      return 0;
    }
    if(u <= l && v >= r){
      return st[id];
    }
    int m = (l + r) >> 1;
    return max(get(id << 1, l, m, u, v), get(id << 1 | 1, m + 1, r, u, v));
  }
  void solve(){
    build(1, 0, n + 1);
    for(int i = 2; i <= n; i++){
      up[0][i] = get(1, 0, n + 1, up[0][i], i);
    }
    for(int i = 1; i < 19; i++){
      for(int j = 0; j < n + 2; j++){
        up[i][j] = up[i - 1][up[i - 1][j]];
      }
    }
    for(int _ = 0; _ < q; _++){
      int l, r, ans = 0;
      cin >> l >> r;
      for(int bit = 18, x = r + 1; bit > -1; bit--){
        int nx = up[bit][x];
        if(nx > l - 1){
          x = nx;
          ans |= 1 << bit;
        }
      }
      cout << ans << "\n";
    }
  }
}
int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	if(fopen(taskname".inp", "r")){
		freopen(taskname".inp", "r", stdin);
	}
  memset(up, 0, sizeof(up));
  cin >> n;
  map<ll, int>val;
  val[f[0] = f[1] = 0] = 1;
  for(int i = 2; i < n + 2; i++){
    cin >> f[i];
    auto it = val.find(f[i] += f[i - 1]);
    if(it != val.end()){
      up[0][i] = it->second;
    }
    val[f[i]] = i;
  }
  cin >> q;
  if(max(n, q) <= 5000){
    sub1::solve();
  }
  else{
    sub23::solve();
  }
}

Compilation message (stderr)

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