Submission #855185

#TimeUsernameProblemLanguageResultExecution timeMemory
855185ooscodeFortune Telling 2 (JOI14_fortune_telling2)C++17
100 / 100
412 ms102520 KiB
// IN THE NAME OF ALLAH
 
#include<bits/stdc++.h>
 
using namespace std;
 
#define fast ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define wall cerr << "------------------------------------" << endl
#define pb push_back
#define F first
#define S second
#define all(x) x.begin() , x.end()
#define int ll
#define kids int tm = (tl + tr)>>1; int cl = v<<1; int cr = v<<1|1
#define test int n; cin >> n; while(n--)

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
#pragma GCC optimize("Ofast")
 
typedef long long ll;
typedef pair<int , int> pii;
typedef pair<ll , ll> pll;
 
const int N = 6e5 + 10;
const int K = 800+10;
const ll mod = 998244353;
const ll INF = 1e18+10;
const int P = 31;
const int lg = 25;

int t[N] , q;
int a[N] , b[N] , n;
int A[N] , B[N];
int rmq[3*N][lg];
int ty[N] , tim[N];
vector<int> qu[N];

int seg[N << 2];
int la[N << 2];

void init() {
	for(int i = 1 ; i < lg ; i++)
		for(int j = 1 ; j <= q ; j++) {
			if(q-j+1 < (1ll << i))
				continue;
			
			rmq[j][i] = max(rmq[j][i-1] , rmq[j + (1ll << (i-1))][i-1]);
		}
}

int ask_rmq(int l , int r) {
	int x = log2(r-l+1);
	return max(rmq[l][x] , rmq[r - (1ll << x) + 1][x]);
}

void shift(int v , int tl , int tr) {
	if(la[v] == 0)
		return;

	seg[v] ^= 1;
	if(tl != tr)
		la[v << 1] ^= 1 , la[v << 1 | 1] ^= 1;

	la[v] = 0;
}

void upd(int v , int tl , int tr , int l , int r) {
	shift(v , tl , tr);
	if(l > r)
		return;
	if(tl == l && tr == r) {
		la[v] ^= 1;
		shift(v , tl , tr);
		return;
	}

	kids;

	upd(cl , tl , tm , l , min(tm , r));
	upd(cr , tm+1 , tr , max(tm+1 , l) , r);
}

void fix(int v , int tl , int tr , int pos , int x) {
	shift(v , tl , tr);
	if(tl == tr) {
		seg[v] = x;
		return;
	}

	kids;
	if(tm >= pos)
		fix(cl , tl , tm , pos , x);
	else
		fix(cl , tm+1 , tr , pos , x);
}

int ask(int v , int tl , int tr , int pos) {
	shift(v , tl , tr);
	if(tl == tr) 
		return seg[v];
	kids;
	if(tm >= pos)
		return ask(cl , tl , tm , pos);
	return ask(cr , tm+1 , tr , pos);
}

void solve() {
	cin >> n >> q;

	vector<pair<int , pii>> vec;

	for(int i = 1 ; i <= n ; i++) {
		cin >> a[i] >> b[i]; 
		vec.pb({max(a[i] , b[i]) , {a[i] , b[i]}});
	}

	vec.pb({-INF , {-INF , -INF}});
	sort(all(vec));

	for(int i = 1 ; i <= n ; i++)
		a[i] = vec[i].S.F , b[i] = vec[i].S.S;

	// wall;
	// cout << "check0 :\n";
	// for(int i = 1 ; i <= n ; i++)
	// 	cout << a[i] << " " << b[i] << "\n";
	// wall;

	vector<pii> ve; 

	for(int i = 1 ; i <= q ; i++) {
		cin >> t[i];
		ve.pb({t[i] , i});
	}

	ve.pb({-INF , -INF});
	sort(all(ve));

	for(int i = 1 ; i <= q ; i++)
		rmq[i][0] = ve[i].S; 
	init();

	for(int i = 1 ; i <= n ; i++) {
		if(a[i] == b[i])
			continue;

		int x = a[i] , y = b[i];
		if(x > y)
			swap(x , y);

		ty[i] = 0;
		if(a[i] < b[i]) ty[i] = 1;

		int l = -1 , r = q+1;
		if(ve[q].F >= x)
			l = lower_bound(all(ve) , make_pair(x , -INF)) - ve.begin();
		if(ve[q].F >= y)
			r = lower_bound(all(ve) , make_pair(y , -INF)) - ve.begin();
		r--;

		if(l == -1 || r == 0 || l > r)
			continue;
		
		tim[i] = ask_rmq(l , r);
		qu[tim[i]].pb(i);
	}

	// wall;
	// cout << "check1 :\n";
	// for(int i = 1 ; i <= n ; i++) {
	// 	cout << i << " " << ty[i] << " " << tim[i] << "\n";
	// }
	// wall;
	// cout << "check2 :\n";
	// for(int i = 1 ; i <= q ; i++) {
	// 	cout << i << " :\n";
	// 	for(auto u : qu[i])
	// 		cout << u << " " << ty[u] << "\n";
	// }
	// wall;

	for(int i = 1 ; i <= q ; i++) {
		auto it = lower_bound(all(vec) , make_pair(t[i]+1 , make_pair(-INF , -INF)));
		int ind = n;

		if(it != vec.end())
			ind = it - vec.begin() - 1;

		upd(1 , 1 , n , 1 , ind);

		// cout << "id = " << ind << " : ";

		for(auto u : qu[i]) {
			int x = ask(1 , 1 , n , u);
			// cout << x << " - ";
			if(x != ty[u])
				upd(1 , 1 , n , u , u);
		}

		// cout << "\n";
	}

	int ans = 0;

	for(int i = 1 ; i <= n ; i++) 
		ans += (ask(1 , 1 , n , i) == 1 ? b[i] : a[i]);

	cout << ans << "\n";
}

signed main()
{   
	solve();
} 

// IT'S EASY TO SEE
// CODE = LOVE

Compilation message (stderr)

fortune_telling2.cpp: In function 'void fix(ll, ll, ll, ll, ll)':
fortune_telling2.cpp:14:56: warning: unused variable 'cr' [-Wunused-variable]
   14 | #define kids int tm = (tl + tr)>>1; int cl = v<<1; int cr = v<<1|1
      |                                                        ^~
fortune_telling2.cpp:91:2: note: in expansion of macro 'kids'
   91 |  kids;
      |  ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...