結果
| 問題 |
No.2292 Interval Union Find
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-05-08 16:04:46 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 391 ms / 5,000 ms |
| コード長 | 2,416 bytes |
| コンパイル時間 | 1,874 ms |
| コンパイル使用メモリ | 193,536 KB |
| 最終ジャッジ日時 | 2025-02-12 21:02:17 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 44 |
ソースコード
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define fi first
#define se second
#define eb emplace_back
#define popc __builtin_popcount
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vp;
typedef unsigned long long ull;
typedef long double ld;
int read() {
int x=0,w=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
while(isdigit(c)) {x=x*10+(c-'0'); c=getchar();}
return x*w;
}
const int N=4e5+9,lim=1e9;
int n,m;
namespace SegT {
int ls[N<<5],rs[N<<5],tag[N<<5],s[N<<5],tot=1;
void set(int p,int l,int r,int t) {
if(t==0) s[p]=0, tag[p]=0; else if(t==1) s[p]=r-l+1, tag[p]=1;
}
void psd(int p,int l,int r) {
int mid=l+r>>1;
if(!ls[p]) ls[p]=++tot;
tag[ls[p]]=tag[p], set(ls[p],l,mid,tag[p]);
if(!rs[p]) rs[p]=++tot;
tag[rs[p]]=tag[p], set(rs[p],mid+1,r,tag[p]);
tag[p]=-1;
}
void cov(int p,int l,int r,int x,int y,int t) {
if(l==x&&r==y) {set(p,l,r,t); return;}
int mid=l+r>>1; if(tag[p]!=-1) psd(p,l,r);
if(y<=mid) cov(ls[p],l,mid,x,y,t);
else if(x>mid) cov(rs[p],mid+1,r,x,y,t);
else cov(ls[p],l,mid,x,mid,t), cov(rs[p],mid+1,r,mid+1,y,t);
s[p]=s[ls[p]]+s[rs[p]];
}
int ql(int p,int l,int r,int x) { //max pos0 <=x
if(s[p]==r-l+1) return -1; if(s[p]==0) return x;
int mid=l+r>>1; if(tag[p]!=-1) psd(p,l,r);
if(x<=mid) return ql(ls[p],l,mid,x);
else {
int res=ql(rs[p],mid+1,r,x);
return res>=0?res:ql(ls[p],l,mid,mid);
}
}
int qr(int p,int l,int r,int x) { //min pos0 >=x
if(s[p]==r-l+1) return n+1; if(s[p]==0) return x;
int mid=l+r>>1; if(tag[p]!=-1) psd(p,l,r);
if(x>mid) return qr(rs[p],mid+1,r,x);
else {
int res=qr(ls[p],l,mid,x);
return res<=n?res:qr(rs[p],mid+1,r,mid+1);
}
}
}
signed main() {
n=read(), m=read();
while(m--) {
int opt=read();
if(opt==1) {
int l=read(), r=read();
SegT::cov(1,0,n,l,r-1,1);
} else if(opt==2) {
int l=read(), r=read();
SegT::cov(1,0,n,l,r-1,0);
} else if(opt==3) {
int x=read(), y=read();
if(x>y) swap(x,y);
int rp=SegT::qr(1,0,n,x);
printf("%d\n",rp>=y);
} else {
int x=read();
int lp=SegT::ql(1,0,n,x-1), rp=SegT::qr(1,0,n,x);
printf("%d\n",rp-lp);
}
}
return 0;
}