Nikita and Sasha play a computer game where you have to breed some magical creatures. Initially, they have kcreatures numbered from 1 to k. Creatures have n different characteristics.
Sasha has a spell that allows to create a new creature from two given creatures. Each of its characteristics will be equal to the maximum of the corresponding characteristics of used creatures. Nikita has a similar spell, but in his spell, each characteristic of the new creature is equal to the minimum of the corresponding characteristics of used creatures. A new creature gets the smallest unused number.
They use their spells and are interested in some characteristics of their new creatures. Help them find out these characteristics.
The first line contains integers n, k and q (1 ≤ n ≤ 105, 1 ≤ k ≤ 12, 1 ≤ q ≤ 105) — number of characteristics, creatures and queries.
Next k lines describe original creatures. The line i contains n numbers ai1, ai2, ..., ain (1 ≤ aij ≤ 109) — characteristics of the i-th creature.
Each of the next q lines contains a query. The i-th of these lines contains numbers ti, xi and yi (1 ≤ ti ≤ 3). They denote a query:
- ti = 1 means that Sasha used his spell to the creatures xi and yi.
- ti = 2 means that Nikita used his spell to the creatures xi and yi.
- ti = 3 means that they want to know the yi-th characteristic of the xi-th creature. In this case 1 ≤ yi ≤ n.
It's guaranteed that all creatures' numbers are valid, that means that they are created before any of the queries involving them.
For each query with ti = 3 output the corresponding characteristic.
2 2 4
1 2
2 1
1 1 2
2 1 2
3 3 1
3 4 2
2
1
5 3 8
1 2 3 4 5
5 1 2 3 4
4 5 1 2 3
1 1 2
1 2 3
2 4 5
3 6 1
3 6 2
3 6 3
3 6 4
3 6 5
5
2
2
3
4
In the first sample, Sasha makes a creature with number 3 and characteristics (2, 2). Nikita makes a creature with number 4 and characteristics (1, 1). After that they find out the first characteristic for the creature 3 and the second characteristic for the creature 4.
題目還是很好懂的吧
一開始的時候,給你k個怪獸,每個怪獸有n個屬性。
然后現在你有三個操作:
第一個操作是用x和y怪物生成一個新的怪物,這個怪物的屬性是x和y的最大值
第二個操作是用x和y怪物生成一個新的怪物,這個怪物的屬性是x和y的最小值
第三個操作是詢問第x個怪物的第y個屬性是多少。
用並查集維護?不太行啊,這么多操作呢,根本無法模擬
這個bitset很有靈性
&用來取大,|用來取小
#include<bits/stdc++.h> using namespace std; const int N=1e6+5; bitset<4096>S[N]; int a[12][N]; int n,k,q; int main() { scanf("%d%d%d",&n,&k,&q); for(int i=0; i<k; i++) { for(int j=0; j<4096; j++) if(j&(1<<i))S[i].set(j); for(int j=0; j<n; j++)scanf("%d",&a[i][j]); } int tot=k; while(q--) { int op,x,y; scanf("%d%d%d",&op,&x,&y),x--,y--; if(op==1)S[tot++]=S[x]&S[y]; else if(op==2)S[tot++]=S[x]|S[y]; else { vector<pair<int,int> >Q; for(int i=0; i<k; i++)Q.push_back({a[i][y],i}); sort(Q.begin(),Q.end()); int b = 0; for(int i=0; i<k; i++) { b|=1<<Q[i].second; if(S[x][b]) { cout<<Q[i].first<<endl; break; } } } } }