Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- const int K = 18;
- int alpha[(1<<K)] ;
- bool actual[1<<K];
- int fillval[1<<K];
- const int inf = (int)1e9;
- void push(int v, int vl, int vr)
- {
- if (vl + 1 == vr) return;
- if (actual[v]) return;
- actual[v*2] = actual[v*2+1] = 0;
- fillval[v*2] = fillval[v*2+1] = fillval[v];
- alpha[v*2] = alpha[v*2+1] = fillval[v];
- actual[v] = 1;
- }
- void intchange(int v, int vl, int vr, int ql, int qr, int val)
- {
- push(v, vl, vr);
- if (vr <= ql || vl >= qr) return;
- if (vl >= ql && vr <= qr)
- {
- actual[v] = 0;
- alpha[v] = val;
- fillval[v] = val;
- return;
- }
- intchange(v*2, vl, (vl+vr)/2, ql, qr, val);
- intchange(v*2+1, (vl+vr)/2, vr, ql, qr, val);
- alpha[v] = max(alpha[v*2], alpha[v*2+1]);
- }
- int getmax(int v, int vl, int vr, int ql, int qr)
- {
- push(v, vl, vr);
- if (vr <= ql || vl >= qr) return -inf;
- if (vl >= ql && vr <= qr) return alpha[v];
- int ans = max(getmax(v*2, vl, (vl+vr)/2, ql, qr),
- getmax(v*2+1, (vl+vr)/2, vr, ql, qr));
- return ans;
- }
- int a[1<<K], dp[1<<K];
- int main()
- {
- int n;
- cin >> n;
- cin >> a[0];
- int k,b,m;
- cin >> k >> b >> m;
- for (int i = 1; i < n; i++) a[i] = (a[i-1]*k+b) % m;
- // последовательность задана странно
- for (int i = 0; i < (1<<K); i++) alpha[i] = -inf;
- int ans = 0;
- for (int i = 0; i < n; i++)
- {
- dp[i] = max(1, getmax(1,0,(1<<(K-1)), 0, a[i]) + 1);
- ans = max(ans, dp[i]);
- intchange(1, 0, (1<<(K-1)), a[i], a[i]+1, dp[i]);
- }
- cout << ans << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement