結果

問題 No.2421 entersys?
ユーザー FplusFplusF
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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);
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0