RT,为什么本地可以运行的代码交到CF上第一个点(就是样例)RE了?
提交编号97742546,有大佬可以给个HACK数据或者帮忙看一下吗
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define il inline
#define re register
const int N = 2e5 + 10;
const int M = 3e5 + 10;
const int Q = 5e5 + 10;
namespace IO {
char buf1[1<<21], buf2[1<<21], *p1 = buf1, *p2 = buf2;
il int get_char() {return p1 == p2 && (p2 = (p1 = buf1) + fread(buf1, 1, 1<<21, stdin), p1 == p2) ? EOF : *p1++;}
#define isdigit(ch) (ch >= 48 && ch <= 57)
template <typename T>
il void read(T &x) {
x=0; re int f = 0, ch = get_char();
while(!isdigit(ch)) f |= ch == '-', ch = get_char();
while(isdigit(ch)) x = (x<<1) + (x<<3) + (ch^48), ch = get_char();
x = f ? -x : x; return;
}
int p3,p4 = -1;
il void Flush() {fwrite(buf2, 1, p4 + 1, stdout); p4 = -1; return;}
il void print(int x) {
if(p4 > (1<<20)) Flush();
if(x < 0) buf2[++p4] = '-', x = -x;
re int tmp[50];
do{tmp[++p3] = x % 10 + 48;}while(x /= 10);
do{buf2[++p4] = tmp[p3--];}while(p3);
buf2[++p4] = '\n';
}
}
using namespace IO;
int n, m, q, lg;
int w[N];
struct Edge{int u, v, w;}E[M];
il bool cmp(Edge a, Edge b){return a.w > b.w;}
int cnt, h[N<<1];
struct edge{int v, nxt;}e[N<<2];
il void add(int u, int v){e[++cnt] = (edge) {v, h[u]}; h[u] = cnt;}
int bel[N];
il int getanc(int x){return bel[x] = (bel[x] ^ x ? getanc(bel[x]) : x);}
il void merge(int u, int v) {
u = getanc(u); v = getanc(v);
bel[u] = v; return;
}
int fa[20][N], dep[N], lef[N], rig[N];
il void dfs(int x, int f) {
if(x <= n) {lef[x] = rig[x] = ++rig[0]; return;}
for(re int i = h[x]; i; i = e[i].nxt) {
fa[0][e[i].v] = x, dfs(e[i].v, f);
lef[x] = min(lef[x], lef[e[i].v]);
rig[x] = max(rig[x], rig[e[i].v]);
}
return;
}
int dti[N];
il void kruscal() {
sort(E + 1, E + m +1, cmp); re int tot = n;
for(re int i = 1; i <= (n<<1); ++i) bel[i] = i;
for(re int i = 1, u, v; i <= m; ++i) {
u = getanc(E[i].u); v = getanc(E[i].v);
if(u == v) continue;
dti[++tot] = E[i].w; bel[u] = bel[v] = tot;
add(tot, u); add(tot, v);
if(tot == n*2 - 1) break;
}
memset(lef, 0x3f, sizeof(lef));
for(re int i = tot; i > n; --i)
if(!rig[i]) dfs(i, 0);
for(re int i = 1; i <= lg; ++i)
for(re int j = 1; j <= tot; ++j)
fa[i][j] = fa[i - 1][fa[i - 1][j]];
return;
}
struct operation{int opt, x;}ope[Q];
int Max[N<<2], pos[N<<2];
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
il void pushup(int x)
{
pos[x] = Max[ls(x)] > Max[rs(x)] ? pos[ls(x)] : pos[rs(x)];
Max[x] = Max[pos[x]]; return;
}
il void change(int i, int l, int r, int po, int x)
{
if(l == r) {Max[i] = x; pos[i] = i; return;}
re int mid = (l + r) >> 1;
if(po > mid) change(rs(i), mid + 1, r, po, x);
else change(ls(i), l, mid, po, x);
pushup(i); return;
}
il int query(int i, int l, int r, int L, int R)
{
if(l > R || r < L) return 0;
if(l >= L && r <= R) return pos[i];
re int mid = (l + r) >> 1;
re int pl = query(ls(i), l, mid, L, R), pr = query(rs(i), mid + 1, r, L, R);
return Max[pl] > Max[pr] ? pl : pr;
}
il void pushall(int x)
{
while(x/2) pushup(x), x /= 2;
return;
}
il int ask(int x, int ti) {
re int res = 0, goal = 0;
for(re int i = lg; i >= 0; --i)
if(dti[fa[i][x]] > ti) x = fa[i][x];
goal = query(1, 1, n, lef[x], rig[x]);
res = Max[goal]; Max[goal] = 0; pushall(goal);
return res;
}
int main() {
read(n), read(m), read(q);
for(re int i = 1; i <= n; ++i) read(w[i]);
for(re int i = 1, u, v, w; i <= m; ++i) {
read(u), read(v);
E[i] = (Edge) {u, v, q + 1};
}
for(re int i = 1, opt, x; i <= q; ++i) {
read(opt); read(x);
ope[i] = (operation) {opt, x};
if(opt == 2) E[x].w = i;
}
kruscal();
for(re int i = 1; i <= n; ++i) change(1, 1, n, lef[i], w[i]);
for(re int i = 1; i <= q; ++i) if(ope[i].opt == 1) print(ask(ope[i].x, i));
Flush(); return 0;
}