Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- #include <cmath>
- #include <utility>
- #include <vector>
- #include <unordered_map>
- #define pb push_back
- #define f first
- #define s second
- #define mp make_pair
- using namespace std;
- const int MXN=1e5+5;
- int n,m,a,b,c;
- int war[MXN],we[MXN],wy[MXN];
- vector<int>tab[MXN];
- bool odw[MXN];
- int rozmiar[MXN],nastepny[MXN],galaz[MXN],numer[MXN],gora[MXN],gleb[MXN],ojciec[MXN];
- int ind[MXN];
- unordered_map<int,unordered_map<int,vector<int> > >mapa;
- vector<int>mapet[MXN];
- inline void dfs(int v){
- odw[v]=1;
- rozmiar[v]=1;
- for(int i=0;i<tab[v].size();i++){
- int u=tab[v][i];
- if(!odw[u]){
- gleb[u]=gleb[v]+1;
- ojciec[u]=v;
- dfs(u);
- rozmiar[v]+=rozmiar[u];
- if(nastepny[v]==-1||rozmiar[u]>rozmiar[nastepny[v]]){
- nastepny[v]=u;
- }
- }
- }
- }
- int ktora=1,ilosc;
- inline void hld(int v){
- odw[v]=1;
- galaz[v]=ktora;
- if(gora[ktora]==0){
- gora[ktora]=v;
- }
- if(nastepny[v]!=-1){//jesli jestesmy w tej samej sciezce
- ind[nastepny[v]]=ind[v]+1;
- hld(nastepny[v]);
- }
- for(int i=0;i<tab[v].size();i++){
- int u=tab[v][i];
- if(!odw[u]&&nastepny[v]!=u){//przeskakujemy na nastepna
- ktora++;
- ind[u]=1;
- hld(u);
- }
- }
- }
- int ojc[MXN][20],ia=0;
- inline void dfs2(int v){
- odw[v]=1;
- we[v]=ia++;
- for(int i=0;i<tab[v].size();i++){
- int u=tab[v][i];
- if(!odw[u]){
- ojc[u][0]=v;
- dfs2(u);
- }
- }
- wy[v]=ia++;
- }
- inline bool czy(int a,int b){//czy a jest nad b
- return(we[a]<=we[b]&&wy[a]>=wy[b]);
- }
- inline int lca(int a,int b){
- if(czy(a,b))return a;
- if(czy(b,a))return b;
- int x=a,skok=18;
- while(skok>=0){
- if(!czy(ojc[x][skok],b)){
- x=ojc[x][skok];
- }
- skok--;
- }
- return ojc[x][0];
- }
- inline bool szukaj(int a,int b,int rod){
- if(mapa[rod][c].size()==0)return 0;
- int p1=0,k1=mapa[rod][c].size();
- int i1=-1,i2=-1;
- while(p1<=k1){
- int s1=(p1+k1)/2;
- if(mapa[rod][c][s1]>=a){
- k1=s1-1;
- i1=mapa[rod][c][s1];
- }
- else p1=s1+1;
- }
- p1=0;k1=mapa[rod][c].size();
- while(p1<=k1){
- int s1=(p1+k1)/2;
- if(mapa[rod][c][s1]<=b){
- p1=s1+1;
- i2=mapa[rod][c][s1];
- }
- else k1=s1-1;
- }
- if(i1==i2&&i1!=-1)return 1;
- if(a<=i1&&i1<=b)return 1;
- if(a<=i2&&i2<=b)return 1;
- return 0;
- }
- inline void lcah(int a,int b){
- bool ok=0;
- int wierz=lca(a,b);
- int rodzaj=galaz[wierz];
- while(galaz[a]!=galaz[b]){
- if(gleb[gora[galaz[a]]]<gleb[gora[galaz[b]]])swap(a,b);
- //obliczam dla dla galezi
- if(galaz[a]!=rodzaj){
- if(szukaj(1,ind[a],galaz[a])==1)ok=1;
- }
- if(galaz[b]!=rodzaj){
- if(szukaj(1,ind[b],galaz[b])==1)ok=1;
- }
- a=ojciec[gora[galaz[a]]];//skaczemy do nastepnej sciezki
- }
- if(gleb[a]>gleb[b])swap(a,b);
- if(szukaj(ind[a],ind[b],rodzaj)==1)ok=1;
- //obliczam dla fragmentu sciezki od a do b
- if(ok==1)cout<<"Find"<<'\n';
- else cout<<"NotFind"<<'\n';
- }
- inline void dfs1(int v){
- odw[v]=1;
- mapa[galaz[v]][war[v]].pb(ind[v]);
- mapet[galaz[v]].pb(war[v]);
- for(int i=0;i<tab[v].size();i++){
- int u=tab[v][i];
- if(!odw[u]){
- dfs1(u);
- }
- }
- }
- void czysc(){
- for(int i=0;i<=n;i++)odw[i]=0;
- }
- int main(){
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- while(cin>>n>>m){
- mapa.clear();
- czysc();
- for(int i=0;i<=n;i++)nastepny[i]=-1,mapet[i].clear(),tab[i].clear(),galaz[i]=0,gleb[i]=0,gora[i]=0,we[i]=0,wy[i]=0,ind[i]=0,rozmiar[i]=0;
- ia=0;ktora=1;ilosc=0;
- for(int i=1;i<=n;i++){
- cin>>war[i];
- }
- for(int i=0;i<n-1;i++){
- cin>>a>>b;
- tab[a].pb(b);
- tab[b].pb(a);
- }
- dfs(1);ind[1]=1;czysc();
- hld(1);czysc();
- dfs2(1);czysc();
- dfs1(1);ojc[1][0]=1;
- for(int j=1;j<=18;j++){
- for(int i=1;i<=n;i++){
- ojc[i][j]=ojc[ojc[i][j-1]][j-1];
- }
- }
- for(int i=1;i<=ktora;i++){
- sort(mapet[i].begin(),mapet[i].end());
- for(int j=0;j<mapet[i].size();j++){
- int u=mapet[i][j];
- sort(mapa[i][u].begin(),mapa[i][u].end());
- }
- }
- for(int i=0;i<m;i++){
- cin>>a>>b>>c;
- lcah(a,b);
- }
- cout<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement