RT,BZOJ4399,调了好长时间了还是调不对,求dalao帮调QAQ
#include<bits/stdc++.h>
#define LL long long
#define _ 0
using namespace std;
/*Grievous Lady*/
template <typename T> void read(T & t){
t = 0;int f = 1;char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-')f =- 1;ch = getchar();}
do{t = t * 10 + ch - '0';ch = getchar();}while(ch >= '0' && ch <= '9');t *= f;
}
#define int long long
#define INF 1000000000
const int kato = 4e7 + 10;
const int atri = 4e5 + 10;
int abi[atri] , tot;
inline int find(int x){
return x == abi[x] ? x : abi[x] = find(abi[x]);
}
struct tree{
protected:
#define mid ((l + r) >> 1)
struct node{
node *ch[2];
LL sum;
double lg;
node(LL sum = 0 , double lg = 0.0): sum(sum) , lg(lg){
ch[0] = ch[1] = NULL;
}
inline void up(){
sum = (ch[0] ? ch[0] -> sum : 0) + (ch[1] ? ch[1] -> sum : 0);
lg = (ch[0] ? ch[0] -> lg : 0) + (ch[1] ? ch[1] -> lg : 0);
}
}*root[kato];
inline void build(node *&o , int l , int r , int x , int val , double tmp){
if(!o) o = new node();
// printf("%lld %lld %lld\n" , l , r , o -> sum);
if(l == r){
o -> sum += val;
o -> lg += (double)val * tmp;
return;
}
// cout << "QAQ" << '\n';
if(x <= mid) build(o -> ch[0] , l , mid , x , val , tmp);
else build(o -> ch[1] , mid + 1 , r , x , val , tmp);
o -> up();
}
inline void merge(node *&x , node *y){
if(x == NULL) return (void)(x = y);
if(y == NULL) return;
x -> sum = (x -> sum + y -> sum) , x -> lg = (x -> lg + y -> lg);
merge(x -> ch[0] , y -> ch[0]); merge(x -> ch[1] , y -> ch[1]);
}
inline int find_small(node *&o , int l , int r , int k){
// printf("%lld %lld\n" , l , r);
if(!o || l >= k) return 0;
if(r < k) {
int res = o -> sum;
delete o;
return res;
}
if(l == r) return 0;
int res = 0;
if(!o -> ch[0]) o -> ch[0] = new node();
res += find_small(o -> ch[0] , l , mid , k);
if(!o -> ch[1]) o -> ch[1] = new node();
res += find_small(o -> ch[1] , mid + 1 , r , k);
// cout << "QAQ" << '\n';
o -> up();
return res;
}
inline int find_big(node *&o , int l , int r , int k){
if(!o || r <= k) return 0;
// cout << "QAQ" << '\n';
if(l > k) {
int res = o -> sum;
delete o;
return res;
}
if(l == r) return 0;
int res = 0;
if(!o -> ch[0]) o -> ch[0] = new node();
res += find_small(o -> ch[0] , l , mid , k);
// cout << "QAQ" << '\n';
if(!o -> ch[1]) o -> ch[1] = new node();
res += find_small(o -> ch[1] , mid + 1 , r , k);
// cout << "QAQ" << '\n';
o -> up();
return res;
}
inline int kth(node *o , int l , int r , int k){
// if(!o) o = new node();
// cout << l << ' ' << r << ' ' << o -> ch[0] << ' ' << &(o -> ch[0]) << '\n';
if(l == r){
return l;
}
if(!o -> ch[0]) o -> ch[0] = new node();
if(k <= o -> ch[0] -> sum){
return kth(o -> ch[0] , l , mid , k);
delete o -> ch[0];
}
else {
return kth(o -> ch[1] , mid + 1 , r , k - o -> ch[0] -> sum);
delete o -> ch[0];
}
}
public:
inline void add(int cnt , int x , int val , double tmp){
// cout << cnt << '\n';
build(root[cnt] , 1 , INF , x , val , tmp);
}
inline void merge(int x , int y){
merge(root[x] , root[y]);
}
inline int find_small(int x , int k){
// cout << INF << '\n';
return find_small(root[x] , 1 , INF , k);
}
inline int find_big(int x , int k){
return find_big(root[x] , 1 , INF , k);
}
inline int kth(int x , int k){
return kth(root[x] , 1 , INF , k);
}
inline int judge(int x , int y){
return root[x] -> lg > root[y] -> lg ? 1 : 0;
}
inline int ask(int x){
return root[x] -> sum;
}
}yuni;
int m , opt , x , y;
inline int Ame_(){
read(m);
for(int i = 1;i <= atri - 1;i ++) abi[i] = i;
for(; m --> 0 ;){
read(opt);
if(opt == 1){
read(x); yuni.add(++ tot , x , 1 , log(x));
// cout << tot << '\n';
}
if(opt == 2){
read(x) , read(y); int fx = find(x) , fy = find(y);
if(fx != fy){
abi[fy] = fx;
yuni.merge(fx , fy);
}
}
if(opt == 3){
read(x) , read(y);
int fx = find(x);
int res = yuni.find_small(fx , y);
// cout << "QAQ" << '\n';
yuni.add(fx , y , res , log(y));
}
if(opt == 4){
read(x) , read(y);
int fx = find(x);
int res = yuni.find_big(fx , y);
yuni.add(fx , y , res , log(y));
}
if(opt == 5){
read(x) , read(y);
int fx = find(x);
printf("%lld\n", yuni.kth(fx , y));
}
if(opt == 6){
read(x) , read(y);
int fx = find(x) , fy = find(y);
printf("%lld\n", yuni.judge(fx , fy));
}
if(opt == 7){
read(x);
int fx = find(x);
printf("%lld\n" , yuni.ask(fx));
}
if(opt == 8){
read(x) , read(y);
}
if(opt == 9){ read(x); }
}
return ~~(0^_^0);
}
int Ame__ = Ame_();
signed main(){;}