Submission #258465

#TimeUsernameProblemLanguageResultExecution timeMemory
258465amoo_safarNew Home (APIO18_new_home)C++17
57 / 100
5099 ms125052 KiB
// Zende bad Shoma nasime faghat ! #include <bits/stdc++.h> #pragma GCC target ("avx2") #pragma GCC optimize("Ofast") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,fma,tune=native") #pragma GCC optimize("unroll-loops") #define pb push_back #define F first #define S second #define all(x) x.begin(), x.end() #define debug(x) cerr << #x << " : " << x << '\n' using namespace std; typedef pair<int, int> pii; const int N = 3e5 + 10; const int Inf = 1e9; int n, q, k; int x[N], t[N], a[N], b[N]; int y[N], c[N], ans[N]; vector<int> V; //map<int, int> mp[N]; set<int> rec[N]; const int SGN = (1 << 19); int seg[SGN << 1]; /* void Ins(int id, int l, int r, int x, int L, int R){ if(r <= L || R <= l) return ; if(l <= L && R <= r){ seg[id].insert(x); return ; } int mid = (L + R) >> 1; Ins(id << 1, l, r, x, L, mid); Ins(id << 1 | 1, l, r, x, mid, R); } void Rem(int id, int l, int r, int x, int L, int R){ if(r <= L || R <= l) return ; if(l <= L && R <= r){ seg[id].erase(seg[id].find(x)); return ; } int mid = (L + R) >> 1; Rem(id << 1, l, r, x, L, mid); Rem(id << 1 | 1, l, r, x, mid, R); } */ inline int FastMin(int &a, int &b){ return a < b ? a : b; } void Set(int idx, int v){ idx += SGN; seg[idx] = v; while(idx >>= 1){ seg[idx] = FastMin(seg[idx << 1], seg[idx << 1 | 1]); } /*if(R - L == 1){ seg[id] = v; return ; } int mid = (L + R) >> 1; if(idx < mid) Set(id << 1, idx, v, L, mid); else Set(id << 1 | 1, idx, v, mid, R); seg[id] = min(seg[id << 1], seg[id << 1 | 1]); */ } void SuperSet(int idx, int v){ idx += SGN; seg[idx] = v; while(seg[idx >>= 1] > v) seg[idx] = v; } int MN; /* int Get(int id, int l, int r, int L, int R){ if(r <= L || R <= l) return Inf; if(l <= L && R <= r) return seg[id]; int mid = (L + R) >> 1; return min(Get(id << 1, l, r, L, mid), Get(id << 1 | 1, l, r, mid, R)); //if(idx < mid) Get(id << 1, idx, L, mid); //else Get(id << 1 | 1, idx, mid, R); } */ int Get(int l){ l += SGN; int r = SGN + SGN; int res = Inf; while(l ^ r){ if(l & 1) res = min(res, seg[l ++]); l >>= 1; r >>= 1; } return res; } /* template<typename T> inline T Prev(T A){return --A; }; template<typename T> inline T Next(T A){return ++A; }; */ /* pii GetRange(pii R){ return pii(R.F, upper_bound(all(V), R.S) - V.begin()); } */ set<int>::iterator hint; inline int GetRange(int tp){ //set<int>::iterator it = hint; /* if(it == rec[tp].begin()) resL = 1; else resL = ( (*Prev(it)) + (*it)) / 2 + 1; */ if(next(hint) == rec[tp].end()) return V.size(); return upper_bound(all(V), ( (*next(hint)) + (*hint)) >> 1) - V.begin(); } void SegGet(int qn){ //cerr << "? " << pl << '\n'; int pl = y[qn]; //MN = Get(1, (lower_bound(all(V), pl) - V.begin()), V.size(), 0, SGN); MN = Get( lower_bound(all(V), pl) - V.begin() ); //cerr << qn << ' ' << MN << '\n'; ans[qn] = max(ans[qn], pl - MN); //if(CNT != k) return -1; //return max(MX - pl, pl - MN); } priority_queue<int, vector<int>, greater<int> > ms[N], msR[N]; inline void Norm(int idx){ priority_queue<int, vector<int>, greater<int> > &AA = msR[idx]; priority_queue<int, vector<int>, greater<int> > &BB = ms[idx]; while(!AA.empty() && AA.top() == BB.top()){ AA.pop(); BB.pop(); } } //multiset<int> ms[N]; inline void SegRem(int tp, int pl){ int ran = GetRange(tp); if(ran == 0) return ; ran --; msR[ran].push(pl); Norm(ran); //ms[ran.S - 1].erase(ms[ran.S - 1].find(ran.F)); Set(ran, (ms[ran].empty() ? Inf : ms[ran].top())); //Rem(1, ran.F, ran.S, pl, 0, V.size()); } inline void SegAdd(int tp, int pl){ int ran = GetRange(tp); if(ran == 0) return ; ran --; ms[ran].push(pl); //if(ms[ran].top() == pl){ //Norm(ran); //debug(ran.S - 1); SuperSet(ran, ms[ran].top()); //Ins(1, ran.F, ran.S, pl, 0, V.size()); //} } /* inline void SegRemNoSet(int tp, int pl){ int ran = GetRange(tp); if(ran == 0) return ; ran --; msR[ran].push(pl); Norm(ran); //ms[ran.S - 1].erase(ms[ran.S - 1].find(ran.F)); //Set(ran, (ms[ran].empty() ? Inf : ms[ran].top())); //Rem(1, ran.F, ran.S, pl, 0, V.size()); } */ /* inline void SegAddNoSet(int tp, int pl){ int ran = GetRange(tp); if(ran == 0) return ; ran --; ms[ran].push(pl); //Norm(ran); //debug(ran.S - 1); //Set(ran, ms[ran].top()); //Ins(1, ran.F, ran.S, pl, 0, V.size()); } */ void Add(int tp, int pl){ //cerr << "+ " << tp << ' ' << pl << '\n'; //mp[tp][pl] ++; //if(mp[tp][pl] > 1) return ; auto it = rec[tp].lower_bound(pl); int la = -1; //if(it != rec[tp].end()) nx = *it; if(it != rec[tp].begin()) la = *prev(it); //if(nx != -1) SegRem(tp, nx); if(la != -1){ hint = prev(it); SegRem(tp, la); } //rec[tp].insert(pl); it = rec[tp].insert(it, pl); //if(nx != -1) SegAdd(tp, nx); //it = rec[tp].find(pl); if(la != -1){ hint = prev(it); SegAdd(tp, la); } hint = it; SegAdd(tp, pl); } void Erase(int tp, int pl){ //cerr << "- " << tp << ' ' << pl << '\n'; //mp[tp][pl] --; //if(mp[tp][pl] > 0) return ; auto it = rec[tp].find(pl); int la = -1; //if(Next(it) != rec[tp].end()) nx = *Next(it); if(it != rec[tp].begin()){ hint = prev(it); la = *hint; } //if(nx != -1) SegRem(tp, nx); if(la != -1){ //hint = Prev(it); SegRem(tp, la); } hint = it; SegRem(tp, pl); it = rec[tp].erase(it); //if(nx != -1) SegAdd(tp, nx); if(la != -1){ hint = --it; SegAdd(tp, la); } } vector<int> Ea[N], Er[N], Eq[N]; int flg[N], open[N], cntn; vector<pii> Alt; int Alti[N], cnti[N]; int main(){ //ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("Big.txt", "r", stdin); //freopen("Out.txt", "w", stdout); //clock_t StartTime = clock(); scanf("%d%d%d", &n, &k, &q); //cin >> n >> k >> q; for(int i = 1; i <= n; i++){ scanf("%d%d%d%d", x + i, t + i, a + i, b + i); Alt.pb({x[i], t[i]}); //cin >> x[i] >> t[i] >> a[i] >> b[i]; b[i] ++; //V.pb(a[i]); V.pb(b[i]); } sort(all(Alt)); Alt.resize(unique(all(Alt)) - Alt.begin()); for(int i = 1; i <= n; i++) Alti[i] = lower_bound(all(Alt), pii(x[i], t[i])) - Alt.begin(); for(int i = 1; i <= q; i++){ scanf("%d%d", y + i, c + i); //cin >> y[i] >> c[i]; V.pb(c[i]); } sort(all(V)); V.resize(unique(all(V)) - V.begin()); V.pb(1e8 + 1); int AllT = V.size(); assert(AllT < N); for(int i = 1; i <= n; i++){ a[i] = lower_bound(all(V), a[i]) - V.begin(); b[i] = lower_bound(all(V), b[i]) - V.begin(); Ea[a[i]].pb(i); Er[b[i]].pb(i); //cerr << "!!! " << a[i] << ' ' << b[i] << '\n'; } for(int i = 1; i <= q; i++){ c[i] = (lower_bound(all(V), c[i]) - V.begin() ); Eq[c[i]].pb(i); //cerr << "? " << c[i] << '\n'; } V.clear(); //for(int i = 1; i <= n; i++) V.pb(x[i]); for(int i = 1; i <= q; i++) V.pb(y[i]); sort(all(V)); V.resize(unique(all(V)) - V.begin()); memset(seg, 31, sizeof seg); seg[0] = -1; for(int tm = 0; tm < AllT; tm++){ for(auto i : Ea[tm]){ cnti[Alti[i]] ++; if(cnti[Alti[i]] == 1) Add(t[i], x[i]); open[t[i]] ++; if(open[t[i]] == 1) cntn ++; } for(auto i : Er[tm]){ cnti[Alti[i]] --; if(cnti[Alti[i]] == 0) Erase(t[i], x[i]); open[t[i]] --; if(open[t[i]] == 0) cntn --; } for(auto i : Eq[tm]){ SegGet(i); //cerr << i << ' ' << c if(cntn < k) flg[i] = true; } //cerr << '\n'; } //if(n == 300000) assert(false); int SM = 100000001; for(int i = 1; i <= n; i ++) x[i] = SM - x[i]; for(int i = 1; i <= q; i ++) y[i] = SM - y[i]; for(auto &el : V) if(el < SM) el = SM - el; sort(all(V)); V.resize(unique(all(V)) - V.begin()); memset(seg, 31, sizeof seg); seg[0] = -1; for(int tm = 0; tm < AllT; tm++){ for(auto i : Ea[tm]){ cnti[Alti[i]] ++; if(cnti[Alti[i]] == 1) Add(t[i], x[i]); } for(auto i : Er[tm]){ cnti[Alti[i]] --; if(cnti[Alti[i]] == 0) Erase(t[i], x[i]); } for(auto i : Eq[tm]) SegGet(i); //cerr << '\n'; } for(int i = 1; i <= q; i++) printf("%d\n", (flg[i] ? -1 : ans[i]) ); //cerr << fixed << setprecision(4) << (double)(clock() - StartTime)/CLOCKS_PER_SEC << '\n'; return 0; } /* 4 2 4 3 1 1 10 9 2 2 4 7 2 5 7 4 1 8 10 5 3 5 6 5 9 1 10 2 1 3 1 1 1 4 1 1 2 6 1 3 1 5 1 7 1 1 1 100000000 1 1 1 1 1 */

Compilation message (stderr)

new_home.cpp: In function 'int main()':
new_home.cpp:270:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d", &n, &k, &q);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:274:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d%d", x + i, t + i, a + i, b + i);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:285:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", y + i, c + i);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...