#include #include #include #include using namespace std; struct unionfind { vector par,_size,_right,_left; unionfind(long n) : par(n+1), _size(n+1,1), _right(n+1), _left(n+1) { iota(par.begin(), par.end(), 0); iota(_right.begin(), _right.end(), 0); iota(_left.begin(), _left.end(), 0); } void init(long long n) { par = vector(n); _size = vector(n); for(long long i=0; i y) return; while(right(x) < y) this->merge(right(x), right(x)+1); } bool issame(long long x, long long y) { return root(x) == root(y); } long long size(long long x) { return _size[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.merge_range(lindex, rindex-1); cerr<