Submission #155838

# Submission time Handle Problem Language Result Execution time Memory
155838 2019-09-30T23:03:22 Z Benq Cake (CEOI14_cake) C++14
100 / 100
1018 ms 17816 KB
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")

#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/rope>

using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
 
typedef string str;
typedef double d;
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define FOR(i,a,b) for (int i = (a); i < (b); i++)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for (int i = (b)-1; i >= (a); i--)
#define R0F(i,a) ROF(i,0,a)
#define trav(a,x) for (auto& a : x)

#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound

#define sz(x) (int)x.size()
#define all(x) begin(x), end(x)
#define rsz resize

const int MOD = 1000000007; // 998244353
const ll INF = 1e18;
const int MX = 200005;
const ld PI = 4*atan((ld)1);

template<class T> bool ckmin(T& a, const T& b) { return a > b ? a = b, 1 : 0; }
template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; }

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

namespace input {
    template<class T> void re(complex<T>& x);
    template<class T1, class T2> void re(pair<T1,T2>& p);
    template<class T> void re(vector<T>& a);
    template<class T, size_t SZ> void re(array<T,SZ>& a);

    template<class T> void re(T& x) { cin >> x; }
    void re(double& x) { string t; re(t); x = stod(t); }
    void re(ld& x) { string t; re(t); x = stold(t); }
    template<class T, class... Ts> void re(T& t, Ts&... ts) { 
        re(t); re(ts...); 
    }

    template<class T> void re(complex<T>& x) { T a,b; re(a,b); x = cd(a,b); }
    template<class T1, class T2> void re(pair<T1,T2>& p) { re(p.f,p.s); }
    template<class T> void re(vector<T>& a) { F0R(i,sz(a)) re(a[i]); }
    template<class T, size_t SZ> void re(array<T,SZ>& a) { F0R(i,SZ) re(a[i]); }
}

using namespace input;

namespace output {
    void pr(int x) { cout << x; }
    void pr(long x) { cout << x; }
    void pr(ll x) { cout << x; }
    void pr(unsigned x) { cout << x; }
    void pr(unsigned long x) { cout << x; }
    void pr(unsigned long long x) { cout << x; }
    void pr(float x) { cout << x; }
    void pr(double x) { cout << x; }
    void pr(ld x) { cout << x; }
    void pr(char x) { cout << x; }
    void pr(const char* x) { cout << x; }
    void pr(const string& x) { cout << x; }
    void pr(bool x) { pr(x ? "true" : "false"); }
    template<class T> void pr(const complex<T>& x) { cout << x; }
    
    template<class T1, class T2> void pr(const pair<T1,T2>& x);
    template<class T> void pr(const T& x);
    
    template<class T, class... Ts> void pr(const T& t, const Ts&... ts) { 
        pr(t); pr(ts...); 
    }
    template<class T1, class T2> void pr(const pair<T1,T2>& x) { 
        pr("{",x.f,", ",x.s,"}"); 
    }
    template<class T> void pr(const T& x) { 
        pr("{"); // const iterator needed for vector<bool>
        bool fst = 1; for (const auto& a: x) pr(!fst?", ":"",a), fst = 0; 
        pr("}");
    }
    
    void ps() { pr("\n"); } // print w/ spaces
    template<class T, class... Ts> void ps(const T& t, const Ts&... ts) { 
        pr(t); if (sizeof...(ts)) pr(" "); ps(ts...); 
    }
    
    void pc() { pr("]\n"); } // debug w/ commas
    template<class T, class... Ts> void pc(const T& t, const Ts&... ts) { 
        pr(t); if (sizeof...(ts)) pr(", "); pc(ts...); 
    }
    #define dbg(x...) pr("[",#x,"] = ["), pc(x);
}

using namespace output;

namespace io {
    void setIn(string s) { freopen(s.c_str(),"r",stdin); }
    void setOut(string s) { freopen(s.c_str(),"w",stdout); }
    void setIO(string s = "") {
        cin.sync_with_stdio(0); cin.tie(0); // fast I/O
        cin.exceptions(cin.failbit); // ex. throws exception when you try to read letter into int
        if (sz(s)) { setIn(s+".in"), setOut(s+".out"); } // for USACO
    }
}

using namespace io;

template<class T> T invGeneral(T a, T b) {
	a %= b; if (a == 0) return b == 1 ? 0 : -1;
	T x = invGeneral(b,a); 
	return x == -1 ? -1 : ((1-(ll)b*x)/a+b)%b;
}

template<class T> struct modular {
	T val; 
	explicit operator T() const { return val; }
	modular() { val = 0; }
	modular(const ll& v) { 
		val = (-MOD <= v && v <= MOD) ? v : v % MOD;
		if (val < 0) val += MOD;
	}
	
	// friend ostream& operator<<(ostream& os, const modular& a) { return os << a.val; }
	friend void pr(const modular& a) { pr(a.val); }
	friend void re(modular& a) { ll x; re(x); a = modular(x); }
   
	friend bool operator==(const modular& a, const modular& b) { return a.val == b.val; }
	friend bool operator!=(const modular& a, const modular& b) { return !(a == b); }
	friend bool operator<(const modular& a, const modular& b) { return a.val < b.val; }

	modular operator-() const { return modular(-val); }
	modular& operator+=(const modular& m) { if ((val += m.val) >= MOD) val -= MOD; return *this; }
	modular& operator-=(const modular& m) { if ((val -= m.val) < 0) val += MOD; return *this; }
	modular& operator*=(const modular& m) { val = (ll)val*m.val%MOD; return *this; }
	friend modular pow(modular a, ll p) {
		modular ans = 1; for (; p; p /= 2, a *= a) if (p&1) ans *= a;
		return ans;
	}
	friend modular inv(const modular& a) { 
		auto i = invGeneral(a.val,MOD); assert(i != -1);
		return i;
	} // equivalent to return exp(b,MOD-2) if MOD is prime
	modular& operator/=(const modular& m) { return (*this) *= inv(m); }
	
	friend modular operator+(modular a, const modular& b) { return a += b; }
	friend modular operator-(modular a, const modular& b) { return a -= b; }
	friend modular operator*(modular a, const modular& b) { return a *= b; }
	
	friend modular operator/(modular a, const modular& b) { return a /= b; }
};

typedef modular<int> mi;
typedef pair<mi,mi> pmi;
typedef vector<mi> vmi;
typedef vector<pmi> vpmi;

template <class T, int ...Ns> struct BIT {
    T val = 0;
    void upd(T v) { val += v; }
    T query() { return val; }
};

template <class T, int N, int... Ns> struct BIT<T, N, Ns...> {
    BIT<T,Ns...> bit[N + 1];
    template<typename... Args> void upd(int pos, Args... args) {
        for (; pos <= N; pos += (pos&-pos)) bit[pos].upd(args...);
    }
    template<typename... Args> T sum(int r, Args... args) {
        T res = 0; for (; r; r -= (r&-r)) res += bit[r].query(args...); 
        return res;
    }
    template<typename... Args> T query(int l, int r, Args... args) {
        return sum(r,args...)-sum(l-1,args...);
    }
}; // BIT<int,10,10> gives a 2D BIT

BIT<int,1000001> B;
int D[250000];

bool les(int a, int b) { return D[a] < D[b]; }

int QQ = 0;
struct cmp {
	bool operator()(const int& a, const int& b) const { 
		if (QQ == -1) return a > b;
		if (QQ == 0) return les(a,b); 
		if (QQ == 1) return a < b;
	}
};

set<int,cmp> S, lef, rig;

int N,a,Q,cnt[250000];

void updCnt(int a, int b) {
	B.upd(D[a],b-cnt[a]);
	cnt[a] = b;
}

void ins(int ind, int nex) {
	D[ind] = nex; S.insert(ind);
	if (ind < a) {
		auto it = lef.lb(ind);
		if (it != end(lef) && *it > ind) return;
		while (it != begin(lef) && *prev(it) < ind) {
			updCnt(*prev(it),0);
			lef.erase(prev(it));
		}
		lef.insert(ind);
		updCnt(ind,ind-(it == end(lef)?-1:*it));
		it --;
		if (it != begin(lef)) updCnt(*prev(it),*prev(it)-*it);
	}
	if (ind > a) {
		auto it = rig.lb(ind);
		if (it != end(rig) && *it < ind) return;
		while (it != begin(rig) && *prev(it) > ind) {
			updCnt(*prev(it),0);
			rig.erase(prev(it));
		}
		rig.insert(ind);
		updCnt(ind,(it == end(rig)?N:*it)-ind);
		// ps("HA",(it == end(rig)?sz(rig):*it),ind,cnt[ind]);
		it --;
		if (it != begin(rig)) updCnt(*prev(it),*it-*prev(it));
	}
}

void ad(int x) {
	if (cnt[x]) B.upd(D[x],-cnt[x]);
	D[x] ++;
	if (cnt[x]) B.upd(D[x],cnt[x]);
}

int main() {
	setIO(); re(N,a); a --;
	F0R(i,N) {
		re(D[i]);
		ins(i,D[i]);
	}
	/*trav(t,S) pr(t,' ');
	ps();
	trav(t,lef) pr(t,' ');
	ps();
	trav(t,rig) pr(t,' ');
	ps();*/
	// F0R(i,N) ps(i,cnt[i]);
	//exit(0);
	re(Q);
	F0R(i,Q) {
		char c; re(c);
		if (c == 'E') {
			int ind, e; re(ind,e); ind --;
			S.erase(ind); B.upd(D[ind],-cnt[ind]); cnt[ind] = 0;
			if (lef.count(ind)) lef.erase(ind);
			if (rig.count(ind)) rig.erase(ind);
			auto it = end(S);
			F0R(i,e-1) ad(*(--it));
			int nex = D[*(--it)]+1;
			ins(ind,nex);
			/*ps("-----");
			F0R(i,N) ps(i,cnt[i]);
			ps("-----");
			trav(t,lef) pr(t,' ');
			ps();
			ps("-----");
			trav(t,rig) pr(t,' ');
			ps();
			ps("-----");*/
		} else {
			int b; re(b); b --;
			if (b == a) ps(0);
			else if (b < a) {
				QQ = -1;
				auto it = prev(lef.ub(b));
				// ps("HA",*it,B.sum(D[*it]-1));
				ps(B.sum(D[*it]-1)+(*it)-b+1);
				QQ = 0;
			} else {
				QQ = 1;
				auto it = prev(rig.ub(b));
				ps(B.sum(D[*it]-1)+b-(*it)+1);
				QQ = 0;
			}
		}
	}
	// you should actually read the stuff at the bottom
}

/* stuff you should look for
	* int overflow, array bounds
	* special cases (n=1?), set tle
	* do smth instead of nothing and stay organized
*/

Compilation message

cake.cpp: In function 'void io::setIn(std::__cxx11::string)':
cake.cpp:126:35: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     void setIn(string s) { freopen(s.c_str(),"r",stdin); }
                            ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
cake.cpp: In function 'void io::setOut(std::__cxx11::string)':
cake.cpp:127:36: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     void setOut(string s) { freopen(s.c_str(),"w",stdout); }
                             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
cake.cpp: In member function 'bool cmp::operator()(const int&, const int&) const':
cake.cpp:217:2: warning: control reaches end of non-void function [-Wreturn-type]
  }
  ^
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 6 ms 504 KB Output is correct
5 Correct 15 ms 1016 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 419 ms 2980 KB Output is correct
2 Correct 281 ms 2848 KB Output is correct
3 Correct 427 ms 2916 KB Output is correct
4 Correct 271 ms 2876 KB Output is correct
5 Correct 567 ms 3788 KB Output is correct
6 Correct 418 ms 3960 KB Output is correct
7 Correct 477 ms 3804 KB Output is correct
8 Correct 321 ms 3872 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 113 ms 6776 KB Output is correct
2 Correct 70 ms 6648 KB Output is correct
3 Correct 69 ms 6520 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 313 ms 15380 KB Output is correct
6 Correct 302 ms 15404 KB Output is correct
7 Correct 151 ms 15136 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 38 ms 760 KB Output is correct
2 Correct 38 ms 912 KB Output is correct
3 Correct 99 ms 3704 KB Output is correct
4 Correct 92 ms 3620 KB Output is correct
5 Correct 104 ms 1124 KB Output is correct
6 Correct 170 ms 4992 KB Output is correct
7 Correct 137 ms 1788 KB Output is correct
8 Correct 319 ms 6992 KB Output is correct
9 Correct 1018 ms 17816 KB Output is correct
10 Correct 333 ms 2536 KB Output is correct
11 Correct 419 ms 3904 KB Output is correct
12 Correct 849 ms 14740 KB Output is correct
13 Correct 739 ms 17672 KB Output is correct