Submission #701756

#TimeUsernameProblemLanguageResultExecution timeMemory
701756shmadProgression (NOI20_progression)C++17
70 / 100
439 ms76324 KiB
#pragma GCC optimize("O3", "unroll-loops") // "Ofast" 	
#pragma GCC target("avx2", "bmi", "bmi2", "lzcnt", "popcnt") 

#include <bits/stdc++.h>

#define int long long
#define vt vector
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
#define f first
#define s second
#define dbg(x) cerr << #x << " = " << x << '\n'
#define bit(x, i) ((x) >> (i) & 1)

using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int, int>;

const int N = 1e6 + 5, mod = 1e9 + 7;
const ll inf = 1e18 + 7;
const ld eps = 1e-6;

int n, q, a[N], d[N];

vt<array<int, 5>> qr;

struct Data {
 	int lst, frst, pref, suf, ans, len;
	Data operator + (Data other) const {
		Data res;
		res.len = len + other.len, res.ans = max(ans, other.ans);
		res.frst = frst, res.lst = other.lst;
		res.pref = pref, res.suf = other.suf;
		res.ans = max(ans, other.ans);
		if (lst == other.frst) {
			if (pref == len) res.pref += other.pref;
			if (other.suf == other.len) res.suf += suf;
			res.ans = max(res.ans, suf + other.pref);
		}
		return res;
	}
}t[4 * N];

void build (int v = 1, int tl = 1, int tr = n + 1) {
	if (tl == tr) {
		t[v] = {d[tl], d[tl], 1, 1, 1, 1};
		return;
	}
	int tm = tl + tr >> 1;
	build(v << 1, tl, tm), build(v << 1 | 1, tm + 1, tr);
	t[v] = t[v << 1] + t[v << 1 | 1];
}

void upd (int pos, int v = 1, int tl = 1, int tr = n + 1) {
	if (tl == tr) {
		t[v] = {d[tl], d[tl], 1, 1, 1, 1};
		return;
	}
	int tm = tl + tr >> 1;
	if (pos <= tm) upd(pos, v << 1, tl, tm);
	else upd(pos, v << 1 | 1, tm + 1, tr);
	t[v] = t[v << 1] + t[v << 1 | 1];
}

Data get (int l, int r, int v = 1, int tl = 1, int tr = n + 1) {
	if (tl > r || tr < l) return {0, 0, 0, 0, 0, 0};
	if (tl >= l && tr <= r) return t[v];
	int tm = tl + tr >> 1;
	return get(l, r, v << 1, tl, tm) + get(l, r, v << 1 | 1, tm + 1, tr);
}

void solve () {
	cin >> n >> q;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i < n; i++) d[i] = a[i + 1] - a[i];
	bool sub1 = 1;
	for (int i = 1; i <= q; i++) {
		int tp, l, r, s = -1, c = -1;
		cin >> tp >> l >> r;
		if (tp < 3) cin >> s >> c;
		qr.pb({tp, l, r, s, c});
	    sub1 &= (l == 1 && r == n);
	}
	if (sub1) {
		int ans = 1, cur = 1, k = a[2] - a[1];
	    for (int i = 1; i < n; i++) {
			if (a[i + 1] - a[i] == k) cur++;
			else {                  	
				k = a[i + 1] - a[i];
				ans = max(ans, cur);
				cur = 2;
			}
	    }
	    ans = max(ans, cur);
		for (auto [tp, l, r, s, c]: qr) {
        	if (tp == 2) ans = n;
        	if (tp == 3) cout << ans << '\n'; 
        }
        return;
	}
	if (max(n, q) <= 1000) {
		for (auto [tp, l, r, s, c]: qr) {
		    if (tp == 1) {
		    	for (int i = l; i <= r; i++) a[i] += (s + (i - l) * c);
		    }
		    if (tp == 2) {
				for (int i = l; i <= r; i++) a[i] = (s + (i - l) * c);
		    }
		    if (tp == 3) {
		    	if (l == r) {
		    		cout << "1\n";
		    		continue;
		    	}
		        int ans = 1, cur = 1, k = a[l + 1] - a[l];
		     	for (int i = l; i < r; i++) {
					if (a[i + 1] - a[i] == k) cur++;
					else {
						k = a[i + 1] - a[i];
						ans = max(ans, cur);
						cur = 2;
					}
		     	}
		     	ans = max(ans, cur);
		     	cout << ans << '\n';
		    }
		}
		return;
	}
	build();
	for (auto [tp, l, r, s, c]: qr) {
		if (tp < 3) {
			if (tp == 1) a[l] += s;
			if (tp == 2) a[l] = s;
			if (l > 1) d[l - 1] = a[l] - a[l - 1], upd(l - 1);
			if (l < n) d[l] = a[l + 1] - a[l], upd(l);
		}
		if (tp == 3) cout << get(l, r - 1).ans + 1 << '\n';
	}
	cout << '\n';
}

bool testcases = 0;

signed main() {
#ifdef ONLINE_JUDGE
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);
#endif
	cin.tie(0) -> sync_with_stdio(0);
	int test = 1;
	if (testcases) cin >> test;
	for (int cs = 1; cs <= test; cs++) {
		solve();
	}
}

Compilation message (stderr)

Progression.cpp: In function 'void build(long long int, long long int, long long int)':
Progression.cpp:51:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   51 |  int tm = tl + tr >> 1;
      |           ~~~^~~~
Progression.cpp: In function 'void upd(long long int, long long int, long long int, long long int)':
Progression.cpp:61:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   61 |  int tm = tl + tr >> 1;
      |           ~~~^~~~
Progression.cpp: In function 'Data get(long long int, long long int, long long int, long long int, long long int)':
Progression.cpp:70:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   70 |  int tm = tl + tr >> 1;
      |           ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...