#include #include #include #include using namespace std; class UnionFind { private: vector par,_size,_right; public: UnionFind(long long n) : par(n+1),_size(n+1,1),_right(n+1) { iota(par.begin(), par.end(), 0); iota(_right.begin(), _right.end(), 0); } long long root(long long x) { if (x == par[x]) return x; else return par[x] = root(par[x]); } bool isSame(long long x, long long y) { return root(x) == root(y); } bool merge(long long x, long long y) { x = root(x); y = root(y); if (isSame(x,y)) return false; if (_size[x] < _size[y]) swap(x,y); par[y] = x; _size[x] += _size[y]; _right[x] = max(_right[x], _right[y]); return true; } void range_merge(long long x, long long y) { if (x >= y) return; while(this->right(x) < y) { this->merge(this->right(x), this->right(x)+1); } } long long size(long long x) { return _size[root(x)]; } long long right(long long x) { return _right[root(x)]; } }; int main() { int n,a,b; cin >> n >> a >> b; vector x(n,0); for (int i=0; i> x[i]; UnionFind uni(n); vector imos(n+1, 0); for (int i=0; i= r) continue; int lindex = l - x.begin(); int rindex = r - x.begin(); uni.merge(i, lindex); uni.range_merge(lindex, rindex-1); cerr<