好家伙开O2优化就全RE 不开就直接AC
查看原帖
好家伙开O2优化就全RE 不开就直接AC
280070
琦子块楼主2021/8/19 22:48

RT 完全一样的呆码 开了O2就RE 不开就AC

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set> 
#include<iomanip>
#define IOS 	cin.tie(0), ios::sync_with_stdio(false) 
#define fi first
#define se second
#define deb(x) cout << #x << " = " << x << endl
#define deb2(x, y) cout << #x << " = " << x << " "  << #y << " = " << y << endl
#define deb3(x, y, z) cout << #x << " = " << x << " "  << #y << " = " << y << " "  << #z << " = " << z << endl
#define all(x) x.begin(), x.end()
#define pb push_back
#define kill(x) return cout<<x<<'\n', 0;
#define Yes cout << "yes" << endl
#define No cout << "no" << endl;

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;
const int N = 200010, M = 10010, mod = 1e9 + 7, mod2 = 998244353, P = 131;
const double eps = 1e-14;
const double PI = acos(-1);

int n,m,t,mx,idx,root[N],dep[N],fa[N][20];
int e[N << 1], ne[N << 1], h[N], idx_edge;
ll w[N],ans;
vector<int> nums;
struct node{
    int l, r, cnt;
}tr[N * 40];
void add(int a, int b){ e[idx_edge] = b, ne[idx_edge] = h[a], h[a] = idx_edge ++;}
int get(int x){ return lower_bound(all(nums), x) - nums.begin();}
int insert(int p, int l, int r, ll val){
    int q = ++ idx;
    tr[q] = tr[p];
    if(l == r) {
        tr[q].cnt ++;
        return q;
    }
    int mid = l + r >> 1;
    if(val <= mid)  tr[q].l = insert(tr[p].l, l, mid, val);
    else    tr[q].r = insert(tr[p].r, mid + 1, r, val);
    tr[q].cnt = tr[tr[q].l].cnt + tr[tr[q].r].cnt;
    return q;
}
int bfs(){
    memset(dep, 0x3f, sizeof dep);
    dep[0] = 0, dep[1] = 1;
    queue<int> q; q.push(1);
    while(!q.empty()){
        int fr = q.front(); q.pop();
        for(int i = h[fr]; ~i; i = ne[i]){
            int j = e[i];
            if(dep[j] > dep[fr] + 1){
                dep[j] = dep[fr] + 1;
                q.push(j);
                fa[j][0] = fr;
                for(int k = 1; k <= 18; ++ k)   fa[j][k] = fa[fa[j][k - 1]][k - 1];
            } 
        }
    }
}
int LCA(int a, int b){
    if(dep[a] < dep[b]) swap(a, b);
    for(int k = 18; k >= 0; -- k)   if(dep[fa[a][k]] >= dep[b]) a = fa[a][k];
    if(a == b)  return a;
    for(int k = 18; k >= 0; -- k)   if(fa[a][k] != fa[b][k])    a = fa[a][k], b = fa[b][k];
    return fa[a][0];
}
void dfs(int u){        //建立主席树
    root[u] = insert(root[fa[u][0]], 0, mx, get(w[u]));
    for(int i = h[u]; ~i; i = ne[i]){
        int j = e[i];
        if(j == fa[u][0])   continue ;
        dfs(j);
    }
}
int query(int u, int v, int lca, int father, int l, int r, int k){
    if(l == r)  return l;
    int mid = l + r >> 1, cnt = tr[tr[u].l].cnt + tr[tr[v].l].cnt - tr[tr[lca].l].cnt - tr[tr[father].l].cnt;
    if(cnt >= k)    return query(tr[u].l, tr[v].l, tr[lca].l, tr[father].l, l, mid, k);
    else    return query(tr[u].r, tr[v].r, tr[lca].r, tr[father].r, mid + 1, r, k - cnt);
}
int querypath(int u, int v, int k){
    int lca = LCA(u, v);
    return query(root[u], root[v], root[lca], root[fa[lca][0]], 0, mx, k);
}
int main(){
// 	freopen("1.in", "r", stdin);
// 	freopen("1.out", "w", stdout);
	IOS;
	cin >> n >> m;
	memset(h, -1, sizeof h);
	for(int i = 1; i <= n; ++ i)  cin >> w[i], nums.pb(w[i]);
	sort(all(nums));
	nums.erase(unique(all(nums)), nums.end());  mx = nums.size() - 1;
	for(int i = 1, a, b; i <= n - 1; ++ i){
	    cin >> a >> b;
	    add(a, b), add(b, a);
	}
	bfs();  dfs(1);
	while(m --){
	    ll l, r, k;
	    cin >> l >> r >> k; l ^= ans;
	    ans = nums[querypath(l, r, k)];
	    cout << ans << endl;
	}
	return 0;
}           
2021/8/19 22:48
加载中...