結果
問題 | No.2421 entersys? |
ユーザー |
![]() |
提出日時 | 2023-08-12 14:29:57 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,004 ms / 3,000 ms |
コード長 | 4,286 bytes |
コンパイル時間 | 2,943 ms |
コンパイル使用メモリ | 230,844 KB |
最終ジャッジ日時 | 2025-02-16 04:55:52 |
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 28 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll=long long;using pll=pair<ll,ll>;using tll=tuple<ll,ll,ll>;using ld=long double;const ll INF=(1ll<<60);#define rep(i,n) for (ll i=0;i<(ll)(n);i++)#define all(v) v.begin(),v.end()template<class T> void chmin(T &a,T b){if(a>b){a=b;}}template<class T> void chmax(T &a,T b){if(a<b){a=b;}}template<class T> unordered_map<ll,ll> compress(vector<T> x){vector<T> unique_v=x;int n=x.size();sort(all(unique_v));unordered_map<ll,ll> mp;unique_v.erase(unique(all(unique_v)),unique_v.end());for(int i=0;i<n;i++){mp[x[i]]=lower_bound(all(unique_v),x[i])-unique_v.begin();}return mp;}struct segment_tree{vector<ll> v,lazy;ll n;segment_tree(ll x){ll s=1;while(s<x) s*=2;n=s;v.assign(s*2-1,0);lazy.assign(s*2-1,0);}void eval(ll k,ll l,ll r){if(lazy[k]!=0){v[k]+=lazy[k];if(1<r-l){lazy[2*k+1]+=lazy[k]/2;lazy[2*k+2]+=lazy[k]/2;}}lazy[k]=0;}void add(ll a,ll b,ll x){add_sub(a,b,x,0ll,0ll,n);}void add_sub(ll a,ll b,ll x,ll k,ll l, ll r){eval(k,l,r);if(r<=a||b<=l){return;}else if(a<=l&&r<=b){lazy[k]+=(r-l)*x;eval(k,l,r);return;}else{add_sub(a,b,x,k*2+1,l,(l+r)/2);add_sub(a,b,x,k*2+2,(l+r)/2,r);v[k]=v[k*2+1]+v[k*2+2];return;}}ll query(ll a,ll b){return query_sub(a,b,0ll,0ll,n);}ll query_sub(ll a,ll b,ll k,ll l,ll r){if(r<=a||b<=l){return 0;}eval(k,l,r);if(a<=l&&r<=b){return v[k];}else{ll vl=query_sub(a,b,k*2+1,l,(l+r)/2);ll vr=query_sub(a,b,k*2+2,(l+r)/2,r);return vl+vr;}}};int main(){ios::sync_with_stdio(false);cin.tie(nullptr);ll n;cin >> n;vector<ll> v;unordered_map<string,set<pll>> mp;vector<ll> vl(n),vr(n);rep(i,n){string x;ll l,r;cin >> x >> l >> r;mp[x].insert({r,l});v.push_back(l);v.push_back(r);vl[i]=l;vr[i]=r;}for(auto &[k,st]:mp) st.insert({INF,INF});ll q;cin >> q;vector<vector<ll>> que(q);vector<string> str(q);rep(i,q){ll z;cin >> z;if(z==1){string x;ll t;cin >> x >> t;str[i]=x;que[i]={1,t};}if(z==2){ll t;cin >> t;que[i]={2,t};v.push_back(t);}if(z==3){string x;ll l,r;cin >> x >> l >> r;str[i]=x;que[i]={3,l,r};v.push_back(l);v.push_back(r);}}v.push_back(INF);unordered_map<ll,ll> z=compress(v);ll m=z.size();segment_tree st(m);rep(i,n) st.add(z[vl[i]],z[vr[i]]+1,1);rep(i,q){if(que[i].front()==1){string x=str[i];ll t=que[i][1];if(!mp.count(x)){cout << "No\n";continue;}auto itr=mp[x].upper_bound({t,t});ll l,r;tie(r,l)=(*itr);if(l<=t&&t<=r){cout << "Yes\n";continue;}if(itr!=mp[x].begin()){itr--;tie(r,l)=(*itr);if(l<=t&&t<=r){cout << "Yes\n";continue;}}cout << "No\n";}if(que[i].front()==2){ll t=que[i][1];if(!z.count(t)) assert(0);cout << st.query(z[t],z[t]+1) << '\n';}if(que[i].front()==3){string x=str[i];ll l=que[i][1],r=que[i][2];mp[x].insert({r,l});mp[x].insert({INF,INF});if(!z.count(l)||!z.count(r)) assert(0);st.add(z[l],z[r]+1,1);}}}