比赛 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;
}