| 比赛 |
2026.8.26 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
interval |
最终得分 |
100 |
| 用户昵称 |
终焉折枝 |
运行时间 |
6.765 s |
| 代码语言 |
C++ |
内存使用 |
17.46 MiB |
| 提交时间 |
2026-08-26 12:44:01 |
显示代码纯文本
#include<iostream>
#include<set>
#include<algorithm>
#include<map>
using namespace std;
#define ciallo(x) cout << x << '\n'
#define i64 int64_t
#define i32 int32_t
#define pb push_back
#define vi vector<i32>
#define sz(x) (i32)x.size()
#define all(x) x.begin(), x.end()
const i32 N = 250005;
const i32 inf = 2e9 + 7;
i32 n, q;
i32 a[N], b[N];
struct ques{
i32 l, r;
i32 id;
bool operator<(const ques &o)const{
return r < o.r;
}
}Q[N];
struct node{
i32 l, r;
mutable i64 v;
bool operator<(const node &o)const{
return l < o.l;
}
};
set<node> s;
i32 t1[N], t2[N];
map<i32, i32> mp;
inline i32 lbt(i32 x){
return x & (-x);
}
inline void add1(i32 x, i32 k){
while(x <= n){
t1[x] += k;
x += lbt(x);
}
}
inline void add2(i32 x, i32 k){
while(x <= n){
t2[x] += k;
x += lbt(x);
}
}
inline i32 qry1(i32 x){
i32 res = 0;
while(x){
res += t1[x];
x -= lbt(x);
}
return res;
}
inline i32 qry2(i32 x){
i32 res = 0;
while(x){
res += t2[x];
x -= lbt(x);
}
return res;
}
auto split(i32 pos){
auto it = s.lower_bound({pos, 0, 0});
if(it != s.end() && it -> l == pos) return it;
it --;
i32 l = it -> l, r = it -> r;
i64 v = it -> v;
s.erase(it);
s.insert({l, pos - 1, v});
return s.insert({pos, r, v}).first;
}
void assign(i32 l, i32 r, i32 v){
auto itr = split(r + 1), itl = split(l);
for(auto it = itl;it != itr;it ++) {
i32 len = it -> r - it -> l + 1;
if(it -> v) add1(it -> v, -len);
add1(v, len);
}
s.erase(itl, itr);
s.insert({l, r, v});
}
i64 ans[N];
int main(){
freopen("intervallavretni.in", "r", stdin);
freopen("intervallavretni.out", "w", stdout);
cin.tie(0) -> ios::sync_with_stdio(0);
cin >> n >> q;
for(i32 i = 1;i <= n;i ++){
cin >> a[i] >> b[i];
}
for(i32 i = 1;i <= q;i ++){
cin >> Q[i].l >> Q[i].r;
Q[i].l ++, Q[i].r ++;
Q[i].id = i;
}
sort(Q + 1, Q + q + 1);
s.insert({1, inf, 0});
i32 p = 1;
for(i32 i = 1;i <= n;i ++){
if(a[i] <= b[i]) assign(a[i], b[i], i);
if(mp.count(b[i])) add2(mp[b[i]], -1);
add2(i, 1); mp[b[i]] = i;
while(p <= q && Q[p].r == i){
i32 l = Q[p].l, r = Q[p].r;
i64 ans1 = qry1(r) - qry1(l - 1);
i64 ans2 = qry2(r) - qry2(l - 1);
ans[Q[p].id] = (ans1 == ans2);
p ++;
}
}
for(i32 i = 1;i <= q;i ++) cout << ans[i] << ' ';
return 0;
}