Submission #1355192

#TimeUsernameProblemLanguageResultExecution timeMemory
1355192chan_uuRegions (IOI09_regions)C++20
0 / 100
135 ms132440 KiB
#include <bits/stdc++.h>
#define fast ios::sync_with_stdio(0), cin.tie(nullptr)
#define all(v) (v).begin(), (v).end()
#define compress(v) sort(all(v)), (v).erase(unique(all(v)), (v).end());
#define sq(n) ((n)*(n))
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using tii = tuple<int, int, int>;
using tll = tuple<ll, ll, ll>;
const ll S = 100000 + 50, MAX = 0x3f3f3f3f, MOD = 1e9+7;;

struct Mat{
	ll A[3][3];
	Mat operator*(const Mat& x){
		Mat ret;
		memset(ret.A, 0, sizeof ret.A);
		for (int i = 0; i < 3; i++){
			for (int j = 0; j < 3; j++){
				for (int k = 0; k < 3; k++)
					ret.A[i][j] = (ret.A[i][j] + A[i][k]*x.A[k][j]) % MOD;
			}
		}
		return ret;
	}
} seg[S << 2];

Mat pow(const Mat& b, ll e){
	if (!e){
		Mat ret;
		memset(ret.A, 0, sizeof ret.A);
		ret.A[0][0] = ret.A[1][1] = ret.A[2][2] = 1;
		return ret;
	}
	Mat ret = pow(b, e/2);
	ret = ret * ret;
	if (e % 2) ret = ret * b;
	return ret;
}

vector<pll> qry;
vector<ll> comp;
vector<Mat> pows;

Mat tmp = {{{0, 1, 0}, {1, 1, 0}, {0, 0, 1}}};

void init(int now, int l, int r){
	if (l == r){
		auto A = seg[now].A;
		A[0][1] = A[1][0] = A[1][1] = A[2][2] = 1;
		return;
	}
	int mid = l+r >> 1;
	init(now*2,l,mid);
	init(now*2+1,mid+1,r);
	seg[now] = seg[now*2] * pows[mid] * seg[now*2+1];
}

void update(int now, int l, int r, int idx, ll v){
	if (idx < l or r < idx) return;
	if (l == r){
		auto A = seg[now].A;
		memset(A, 0, sizeof seg[now].A);
		A[0][1] = A[2][2] = 1;
		A[2][0] = A[2][1] = v;
		return;
	}
	int mid = l+r >> 1;
	update(now*2, l, mid, idx, v);
	update(now*2+1, mid+1, r, idx, v);
	seg[now] = seg[now*2] * pows[mid] * seg[now*2+1];
}

int main() {
	fast;
#ifdef ONLINE_JUDGE
	#define endl '\n'
#else
	freopen("input.txt", "r", stdin);
#endif

	ll N, Q;
	cin >> N >> Q;
	qry.resize(Q);
	for (auto&[a,b]:qry) {
		cin >> a >> b;
		b %= MOD;
		comp.push_back(a);
	}
	comp.push_back(-1);
	compress(comp);
	pows.resize(comp.size());
	pows[0] = pow(tmp, comp[1]-1), pows.back() = pow(tmp, N - comp.back());
	for (int i = 1; i+1 < comp.size(); i++)
		pows[i] = pow(tmp, comp[i+1] - comp[i] - 1);
	init(1,1,comp.size()-1);
	for (auto&[a,b]:qry){
		update(1, 1, comp.size()-1, lower_bound(all(comp), a) - comp.begin(), b);
		Mat now = pows[0] * seg[1] * pows.back();
		cout << (now.A[1][0] + now.A[2][0]) % MOD << '\n';
	}
}

Compilation message (stderr)

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