Informatica Solution
Informatica Solution
/**
* author: fractal
**/
#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define mp make_pair
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define speed ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define sz(x) (int)x.size()
#define len(x) (int)strlen(x)
#define all(x) x.begin(), x.end()
#define debug cerr << "OK\n";
#define ub upper_bound
#define lb lower_bound
#define make_unique(x) sort(all(x)), x.erase(unique(all(x)), x.end())
mt19937 bruh(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 rofl(chrono::steady_clock::now().time_since_epoch().count());
#ifndef PC
#define gcd __gcd
#endif
int n;
ll t[N], x[N];
vector<int> q[N];
priority_queue<int, vector<int>, greater<int>> s;
int main() {
speed;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> x[i] >> t[i];
}
ll tl = 0, tr = INF, ans = -1;
#include <bits/stdc++.h>
struct Line {
ll k, b;
ll get(ll x) {
return k * x + b;
}
void add(Line l) {
if (!empty() && l.k == back().k) {
if (cmp(l.b, back().b)) {
pop_back();
}
else {
return;
}
}
push_back(l);
}
ll get_ptr(ll x) {
while (ptr + 1 < (int) size() && cmp(at(ptr + 1).get(x), at(ptr).get(x))) {
ptr++;
}
ll get(ll x) {
int l = 0, r = (int) size() - 1;
while (l != r) {
int m = (l + r) >> 1;
return at(l).get(x);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
dpR[i] = hR.get_ptr(prefC[i]);
dpR[i] += (H[i] + prefDif[i - 1] - prefDot[i - 1] + prefGap[i - 1] * prefC[i]);
}
#include <bits/stdc++.h>
#define f first
#define s second
#define pb push_back
#define mp make_pair
struct SQRT_SET {
bool was[N];
int ptr;
void init() {
for (int i = 0; i < N; i++)
was[i] = 1;
ptr = 0;
}
void erase(int x) {
was[x] = 0;
}
int get() {
while (!was[ptr])
ptr++;
return ptr;
}
} ST;
int n, q;
int a[N], b[N];
int ql[N], qr[N];
const int K = 600;
int ans[N];
int qpp[N];
int qp[N], qpn;
int pp(int v) {
return p[v] == v ? v : p[v] = pp(p[v]);
}
bool in_block[N];
vector<int> g[N];
int was[N], timer;
int V, E, MX;
void dfs(int v) {
V++;
E += g[v].size();
MX = max(MX, pval[v]);
was[v] = timer;
for (auto to: g[v])
if (was[to] != timer)
dfs(to);
}
int get(int l, int r) {
timer++;
int mex = n;
m = 0;
return mex;
}
c_timer++;
cx_n = 0;
for (int i = L; i <= R; i++) {
{
int x = a[i];
if (c_was[x] != c_timer) {
cx[cx_n++] = x;
c_was[x] = c_timer;
}
}
{
int x = b[i];
if (c_was[x] != c_timer) {
cx[cx_n++] = x;
c_was[x] = c_timer;
}
}
}
for (int i = 0; i < cx_n; i++)
cp[cx[i]] = i;
qpn = 0;
for (int i = 0; i < q; i++)
if (L <= ql[qpp[i]] && ql[qpp[i]] <= R)
qp[qpn++] = qpp[i];
int ptr = R + 1;
for (int i = 0; i < qpn; i++) {
int j = qp[i];
while (ptr <= qr[j]) {
int v = pp(a[ptr]);
int u = pp(b[ptr]);
int w = -1;
if (v == n && u == n) {
} else if (v == n) {
ST.erase(pval[u]);
p[u] = n;
if (in_block[u])
w = u;
} else if (u == n) {
ST.erase(pval[v]);
p[v] = n;
if (in_block[v])
w = v;
} else if (v != u) {
if (in_block[u])
swap(v, u);
ST.erase(min(pval[v], pval[u]));
if (in_block[v])
ST.erase(max(pval[v], pval[u]));
pval[v] = max(pval[v], pval[u]);
p[u] = v;
if (in_block[u])
w = u;
} else {
ST.erase(pval[v]);
p[v] = n;
if (in_block[v])
w = v;
}
if (w != -1) {
int p = cp[w];
cx[p] = cx[cx_n - 1];
cp[cx[p]] = p;
cx_n--;
}
ptr++;
}
ans[j] = get(ql[j], min(qr[j], R));
}
}
void solve() {
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
cin >> b[i];
cin >> q;
for (int i = 0; i < q; i++) {
cin >> ql[i] >> qr[i];
ql[i]--, qr[i]--;
qpp[i] = i;
}
sort(qpp, qpp + q, [](int i, int j) {
return qr[i] < qr[j];
});
for (int i = 0; i < n; i += K)
solve(i, min(n, i + K) - 1);
for (int i = 0; i < q; i++)
cout << ans[i] << "\n";
}
int main() {
#ifdef DEBUG
freopen("input.txt", "r", stdin);
#endif
ios_base::sync_with_stdio(false);
int t = 1;
// cin >> t;
for (int i = 1; i <= t; i++) {
// cout << "Case #" << i << endl;
solve();
}
}
Задача D:
#include <stdio.h>
#include <bits/stdc++.h>
#define F first
#define S second
#define en end()
#define bg begin()
#define y1 y1234567890
#define um unordered_map
ll a[N], ar[N];
vector < pii > qr[N];
int n, q, pw[N], last1[Log], last2[Log], last[Log][N], mx[Log], cur_mx[Log], ans[N];
int cnt[Log];
int p1 = 0, p2 = 0;
last1[0] = last2[0] = i;
cur_mx[0] = i;
while ((p1 + 1 < Log && last1[p1 + 1] != -1) || (p2 + 1 < Log && last2[p2 + 1] !=
-1)) {
if (last1[p1 + 1] != -1 && (last2[p2 + 1] == -1 || last1[p1 + 1] > last2[p2 +
1]))
p1++;
else
p2++;
assert(p1 + p2 < Log);
cur_mx[p1 + p2] = min(cur_mx[p1 + p2 - 1], min(last1[p1], last2[p2]));
}
for (int j = 0; j < Log; j++)
mx[j] = max(mx[j], cur_mx[j]);
int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
//freopen(".err", "w", stderr);
//mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
//cin.tie(NULL);
//cout.tie(NULL);
//ios_base::sync_with_stdio(false);
int T = 1;
//cin >> T;
while (T--)
solve();
return 0;
}
Задача E:
#include <bits/stdc++.h>
struct PREF{
ll prefa;
ll prefb;
ll prefa_sqr;
ll prefb_sqr;
PREF add_pref_sum(int v) {
PREF x = {prefa, prefb, prefa_sqr, prefb_sqr};
add(x.prefa, ver[v].sum_lev - (ver[v].lev - 1) * ver[v].sz);
add(x.prefb, mult(v, sum(ver[v].sum_lev, -mult((ver[v].lev - 1) , ver[v].sz))));
add(x.prefb, sum(mult(-ver[v].sum_up_lev[1], ver[v].sz), mult(ver[v].sum_up_lev[0],
ver[v].sum_lev)));
ll cur = sum(sum(mult(mult((ver[v].lev-1), (ver[v].lev-1)), ver[v].sz),
-mult(2 * ver[v].sum_lev, (ver[v].lev-1))), ver[v].sum_lev_sqr);
add(x.prefa_sqr, cur);
add(x.prefb_sqr, mult(cur, v));
add(x.prefb_sqr, mult(ver[v].sum_up_lev[2], ver[v].sz)
- mult(2 * ver[v].sum_lev, ver[v].sum_up_lev[1]) + mult(ver[v].sum_lev_sqr,
ver[v].sum_up_lev[0]));
return x;
}
PREF sub_pref_sum(PREF o) {
PREF x = {sum(prefa, - o.prefa), sum(prefb, -o.prefb), sum(prefa_sqr, -o.prefa_sqr),
sum(prefb_sqr, -o.prefb_sqr)};
return x;
}
} b[maxn];
ll stu[maxn][2];
void solve() {
cin >> n >> q >> t;
t--;
vector<int> st;
for(int i = 1; i <= n; i++) {
p[i] = i;
cin >> a[i];
}
a[n+1] = 1<<30;
for(int i = 0; i < q; i++) {
int l, r;
cin >> l >> r;
Q[r].push_back({l, i});
}
for(int i = 1; i <= n + 1; i++) {
while(st.size() > 0 && a[i] > a[st.back()]) {
g[i].push_back(st.back());
st.pop_back();
}
st.push_back(i);
}
dfs(n+1, 0);
/**
* author: fractal
**/
#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define mp make_pair
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define speed ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define sz(x) (int)x.size()
#define len(x) (int)strlen(x)
#define all(x) x.begin(), x.end()
#define debug cerr << "OK\n";
#define ub upper_bound
#define lb lower_bound
#define make_unique(x) sort(all(x)), x.erase(unique(all(x)), x.end())
mt19937 bruh(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 rofl(chrono::steady_clock::now().time_since_epoch().count());
#ifndef PC
#define gcd __gcd
#endif
int n, p[3][N];
int ans = 1;
vpii v;
int main() {
speed;
fact[0] = 1;
for (int i = 1; i <= M; ++i) {
fact[i] = mul(fact[i - 1], i);
}
invf[M] = binpow(fact[M], mod - 2);
for (int i = M; i >= 1; --i) {
invf[i - 1] = mul(invf[i], i);
}
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> p[1][i];
if (p[1][i] != 0) {
v.pb({i, p[1][i] - i});
v.pb({i - 1, p[1][i] - i});
}
}
for (int i = 1; i <= n; ++i) {
cin >> p[2][i];
if (p[2][i] != 0) {
v.pb({p[2][i] - i, i});
v.pb({p[2][i] - i, i - 1});
}
}
sort(all(v));
// for (auto [x, y] : v)
// cerr << x << " " << y << '\n';
pii last = {0, 0};
for (auto it : v) {
if (it.F < it.S) {
cout << 0 << '\n';
return 0;
}
if (last.F <= it.F && last.S <= it.S) {
ans = mul(ans, good_ways(last.F, last.S, it.F, it.S));
last = it;
continue;
}
cout << 0 << '\n';
return 0;
}
ans = mul(ans, good_ways(last.F, last.S, n, n));
cout << ans << '\n';
}