int main( ) { int i; int a, b; scanf("%d%d%d", &n, &m, &p); initSet( ); for (i = 0; i < m; ++i) { scanf("%d%d", &a, &b); uniSet(a, b); } for (i = 0; i < p; ++i) { scanf("%d%d", &a, &b); if (find(a) == find(b)) { printf("Yes\n"); } else { printf("No\n"); } } return 0; }
void visit(const TRenderableVariableTemplate& rvar) { typedef typename TRenderableVariableTemplate::Type DataType; const GlProgramVariable& glvar = rvar.getGlProgramVariable(); // Array size U arraySize; if(rvar.isInstanced()) { arraySize = std::min<U>(m_instanceCount, glvar.getArraySize()); } else { arraySize = glvar.getArraySize(); } // Set uniform // Bool hasWorldTrfs = m_renderable->getHasWorldTransforms(); const Mat4& vp = m_fr->getViewProjectionMatrix(); const Mat4& v = m_fr->getViewMatrix(); switch(rvar.getBuildinId()) { case BuildinMaterialVariableId::NO_BUILDIN: uniSet<DataType>(glvar, rvar.begin(), arraySize); break; case BuildinMaterialVariableId::MVP_MATRIX: if(hasWorldTrfs) { Mat4* mvp = m_drawer->m_r->getSceneGraph().getFrameAllocator(). newInstance<Mat4>(arraySize); for(U i = 0; i < arraySize; i++) { Transform worldTrf; m_renderable->getRenderWorldTransform( m_visibleNode->getSpatialIndex(i), worldTrf); mvp[i] = vp * Mat4(worldTrf); } uniSet(glvar, &mvp[0], arraySize); } else { ANKI_ASSERT(arraySize == 1 && "Shouldn't instance that one"); uniSet(glvar, &vp, 1); } break; case BuildinMaterialVariableId::MV_MATRIX: { ANKI_ASSERT(hasWorldTrfs); Mat4* mv = m_drawer->m_r->getSceneGraph().getFrameAllocator(). newInstance<Mat4>(arraySize); for(U i = 0; i < arraySize; i++) { Transform worldTrf; m_renderable->getRenderWorldTransform( m_visibleNode->getSpatialIndex(i), worldTrf); mv[i] = v * Mat4(worldTrf); } uniSet(glvar, &mv[0], arraySize); } break; case BuildinMaterialVariableId::VP_MATRIX: uniSet(glvar, &vp, 1); break; case BuildinMaterialVariableId::NORMAL_MATRIX: if(hasWorldTrfs) { Mat3* normMats = m_drawer->m_r->getSceneGraph().getFrameAllocator(). newInstance<Mat3>(arraySize); for(U i = 0; i < arraySize; i++) { Transform worldTrf; m_renderable->getRenderWorldTransform( m_visibleNode->getSpatialIndex(i), worldTrf); Mat4 mv = v * Mat4(worldTrf); normMats[i] = mv.getRotationPart(); normMats[i].reorthogonalize(); } uniSet(glvar, &normMats[0], arraySize); } else { ANKI_ASSERT(arraySize == 1 && "Having that instanced doesn't make sense"); Mat3 normMat = v.getRotationPart(); uniSet(glvar, &normMat, 1); } break; case BuildinMaterialVariableId::BILLBOARD_MVP_MATRIX: { // Calc the billboard rotation matrix Mat3 rot = m_fr->getViewMatrix().getRotationPart().getTransposed(); Mat4* bmvp = m_drawer->m_r->getSceneGraph().getFrameAllocator(). newInstance<Mat4>(arraySize); for(U i = 0; i < arraySize; i++) { Transform trf; m_renderable->getRenderWorldTransform(i, trf); trf.setRotation(Mat3x4(rot)); bmvp[i] = vp * Mat4(trf); } uniSet(glvar, &bmvp[0], arraySize); } break; case BuildinMaterialVariableId::MAX_TESS_LEVEL: { F32 maxtess = rvar.RenderComponentVariable:: template operator[]<F32>(0); F32 tess = 0.0; if(m_flod >= 1.0) { tess = 1.0; } else { tess = maxtess - m_flod * maxtess; tess = std::max(tess, 1.0f); } uniSet(glvar, &tess, 1); } break; case BuildinMaterialVariableId::BLURRING: { F32 blurring = 0.0; uniSet(glvar, &blurring, 1); } break; case BuildinMaterialVariableId::MS_DEPTH_MAP: { auto unit = glvar.getTextureUnit(); m_drawer->m_r->getMs()._getSmallDepthRt().bind(m_jobs, unit); } break; default: ANKI_ASSERT(0); break; } }