QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#106754 | #6409. Classical Data Structure Problem | maroonrk | TL | 2982ms | 70692kb | C++20 | 26.2kb | 2023-05-19 03:22:51 | 2023-05-19 03:22:54 |
Judging History
answer
#ifndef LOCAL
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
#endif
#include <bits/stdc++.h>
using namespace std;
//fast IO by yosupo
//sc.read(string) だと append される
struct Scanner {
FILE* fp = nullptr;
char line[(1 << 15) + 1];
size_t st = 0, ed = 0;
void reread() {
memmove(line, line + st, ed - st);
ed -= st;
st = 0;
ed += fread(line + ed, 1, (1 << 15) - ed, fp);
line[ed] = '\0';
}
bool succ() {
while (true) {
if (st == ed) {
reread();
if (st == ed) return false;
}
while (st != ed && isspace(line[st])) st++;
if (st != ed) break;
}
if (ed - st <= 50) reread();
return true;
}
template <class T, enable_if_t<is_same<T, string>::value, int> = 0>
bool read_single(T& ref) {
if (!succ()) return false;
ref.clear();
while (true) {
size_t sz = 0;
while (st + sz < ed && !isspace(line[st + sz])) sz++;
ref.append(line + st, sz);
st += sz;
if (!sz || st != ed) break;
reread();
}
return true;
}
template <class T, enable_if_t<is_integral<T>::value, int> = 0>
bool read_single(T& ref) {
if (!succ()) return false;
bool neg = false;
if (line[st] == '-') {
neg = true;
st++;
}
ref = T(0);
while (isdigit(line[st])) {
ref = 10 * ref + (line[st++] - '0');
}
if (neg) ref = -ref;
return true;
}
template <class T> bool read_single(vector<T>& ref) {
for (auto& d : ref) {
if (!read_single(d)) return false;
}
return true;
}
void read() {}
template <class H, class... T> void read(H& h, T&... t) {
bool f = read_single(h);
assert(f);
read(t...);
}
Scanner(FILE* _fp) : fp(_fp) {}
};
struct Printer {
public:
template <bool F = false> void write() {}
template <bool F = false, class H, class... T>
void write(const H& h, const T&... t) {
if (F) write_single(' ');
write_single(h);
write<true>(t...);
}
template <class... T> void writeln(const T&... t) {
write(t...);
write_single('\n');
}
Printer(FILE* _fp) : fp(_fp) {}
~Printer() { flush(); }
private:
static constexpr size_t SIZE = 1 << 15;
FILE* fp;
char line[SIZE], small[50];
size_t pos = 0;
void flush() {
fwrite(line, 1, pos, fp);
pos = 0;
}
void write_single(const char& val) {
if (pos == SIZE) flush();
line[pos++] = val;
}
template <class T, enable_if_t<is_integral<T>::value, int> = 0>
void write_single(T val) {
if (pos > (1 << 15) - 50) flush();
if (val == 0) {
write_single('0');
return;
}
if (val < 0) {
write_single('-');
val = -val; // todo min
}
size_t len = 0;
while (val) {
small[len++] = char('0' + (val % 10));
val /= 10;
}
for (size_t i = 0; i < len; i++) {
line[pos + i] = small[len - 1 - i];
}
pos += len;
}
void write_single(const string& s) {
for (char c : s) write_single(c);
}
void write_single(const char* s) {
size_t len = strlen(s);
for (size_t i = 0; i < len; i++) write_single(s[i]);
}
template <class T> void write_single(const vector<T>& val) {
auto n = val.size();
for (size_t i = 0; i < n; i++) {
if (i) write_single(' ');
write_single(val[i]);
}
}
void write_single(long double d){
{
long long v=d;
write_single(v);
d-=v;
}
write_single('.');
for(int _=0;_<8;_++){
d*=10;
long long v=d;
write_single(v);
d-=v;
}
}
};
Scanner sc(stdin);
Printer pr(stdout);
using ll=long long;
//#define int ll
#define rng(i,a,b) for(int i=int(a);i<int(b);i++)
#define rep(i,b) rng(i,0,b)
#define gnr(i,a,b) for(int i=int(b)-1;i>=int(a);i--)
#define per(i,b) gnr(i,0,b)
#define pb push_back
#define eb emplace_back
#define a first
#define b second
#define bg begin()
#define ed end()
#define all(x) x.bg,x.ed
#define si(x) int(x.size())
#ifdef LOCAL
#define dmp(x) cerr<<__LINE__<<" "<<#x<<" "<<x<<endl
#else
#define dmp(x) void(0)
#endif
template<class t,class u> bool chmax(t&a,u b){if(a<b){a=b;return true;}else return false;}
template<class t,class u> bool chmin(t&a,u b){if(b<a){a=b;return true;}else return false;}
template<class t> using vc=vector<t>;
template<class t> using vvc=vc<vc<t>>;
using pi=pair<int,int>;
using vi=vc<int>;
template<class t,class u>
ostream& operator<<(ostream& os,const pair<t,u>& p){
return os<<"{"<<p.a<<","<<p.b<<"}";
}
template<class t> ostream& operator<<(ostream& os,const vc<t>& v){
os<<"{";
for(auto e:v)os<<e<<",";
return os<<"}";
}
#define mp make_pair
#define mt make_tuple
#define one(x) memset(x,-1,sizeof(x))
#define zero(x) memset(x,0,sizeof(x))
#ifdef LOCAL
void dmpr(ostream&os){os<<endl;}
template<class T,class... Args>
void dmpr(ostream&os,const T&t,const Args&... args){
os<<t<<" ";
dmpr(os,args...);
}
#define dmp2(...) dmpr(cerr,__LINE__,##__VA_ARGS__)
#else
#define dmp2(...) void(0)
#endif
using uint=unsigned;
using ull=unsigned long long;
template<class t,size_t n>
ostream& operator<<(ostream&os,const array<t,n>&a){
return os<<vc<t>(all(a));
}
template<int i,class T>
void print_tuple(ostream&,const T&){
}
template<int i,class T,class H,class ...Args>
void print_tuple(ostream&os,const T&t){
if(i)os<<",";
os<<get<i>(t);
print_tuple<i+1,T,Args...>(os,t);
}
template<class ...Args>
ostream& operator<<(ostream&os,const tuple<Args...>&t){
os<<"{";
print_tuple<0,tuple<Args...>,Args...>(os,t);
return os<<"}";
}
ll read(){
ll i;
cin>>i;
return i;
}
vi readvi(int n,int off=0){
vi v(n);
rep(i,n)v[i]=read()+off;
return v;
}
pi readpi(int off=0){
int a,b;cin>>a>>b;
return pi(a+off,b+off);
}
template<class t>
void print_single(t x,int suc=1){
cout<<x;
if(suc==1)
cout<<"\n";
if(suc==2)
cout<<" ";
}
template<class t,class u>
void print_single(const pair<t,u>&p,int suc=1){
print_single(p.a,2);
print_single(p.b,suc);
}
template<class T>
void print_single(const vector<T>&v,int suc=1){
rep(i,v.size())
print_single(v[i],i==int(v.size())-1?suc:2);
}
template<class T>
void print_offset(const vector<T>&v,ll off,int suc=1){
rep(i,v.size())
print_single(v[i]+off,i==int(v.size())-1?suc:2);
}
template<class T,size_t N>
void print_single(const array<T,N>&v,int suc=1){
rep(i,N)
print_single(v[i],i==int(N)-1?suc:2);
}
template<class T>
void print(const T&t){
print_single(t);
}
template<class T,class ...Args>
void print(const T&t,const Args&...args){
print_single(t,2);
print(args...);
}
string readString(){
string s;
cin>>s;
return s;
}
template<class T>
T sq(const T& t){
return t*t;
}
void YES(bool ex=true){
cout<<"YES\n";
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
void NO(bool ex=true){
cout<<"NO\n";
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
void Yes(bool ex=true){
cout<<"Yes\n";
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
void No(bool ex=true){
cout<<"No\n";
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
//#define CAPITAL
/*
void yes(bool ex=true){
#ifdef CAPITAL
cout<<"YES"<<"\n";
#else
cout<<"Yes"<<"\n";
#endif
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
void no(bool ex=true){
#ifdef CAPITAL
cout<<"NO"<<"\n";
#else
cout<<"No"<<"\n";
#endif
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}*/
void possible(bool ex=true){
#ifdef CAPITAL
cout<<"POSSIBLE"<<"\n";
#else
cout<<"Possible"<<"\n";
#endif
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
void impossible(bool ex=true){
#ifdef CAPITAL
cout<<"IMPOSSIBLE"<<"\n";
#else
cout<<"Impossible"<<"\n";
#endif
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
constexpr ll ten(int n){
return n==0?1:ten(n-1)*10;
}
const ll infLL=LLONG_MAX/3;
#ifdef int
const int inf=infLL;
#else
const int inf=INT_MAX/2-100;
#endif
int topbit(signed t){
return t==0?-1:31-__builtin_clz(t);
}
int topbit(ll t){
return t==0?-1:63-__builtin_clzll(t);
}
int topbit(ull t){
return t==0?-1:63-__builtin_clzll(t);
}
int botbit(signed a){
return a==0?32:__builtin_ctz(a);
}
int botbit(ll a){
return a==0?64:__builtin_ctzll(a);
}
int botbit(ull a){
return a==0?64:__builtin_ctzll(a);
}
int popcount(signed t){
return __builtin_popcount(t);
}
int popcount(ll t){
return __builtin_popcountll(t);
}
int popcount(ull t){
return __builtin_popcountll(t);
}
int bitparity(ll t){
return __builtin_parityll(t);
}
bool ispow2(int i){
return i&&(i&-i)==i;
}
ll mask(int i){
return (ll(1)<<i)-1;
}
ull umask(int i){
return (ull(1)<<i)-1;
}
ll minp2(ll n){
if(n<=1)return 1;
else return ll(1)<<(topbit(n-1)+1);
}
bool inc(int a,int b,int c){
return a<=b&&b<=c;
}
template<class t> void mkuni(vc<t>&v){
sort(all(v));
v.erase(unique(all(v)),v.ed);
}
ll rand_int(ll l, ll r) { //[l, r]
//#ifdef LOCAL
static mt19937_64 gen;
/*#else
static mt19937_64 gen(chrono::steady_clock::now().time_since_epoch().count());
#endif*/
return uniform_int_distribution<ll>(l, r)(gen);
}
ll rand_int(ll k){ //[0,k)
return rand_int(0,k-1);
}
template<class t>
void myshuffle(vc<t>&a){
rep(i,si(a))swap(a[i],a[rand_int(0,i)]);
}
template<class t>
int lwb(const vc<t>&v,const t&a){
return lower_bound(all(v),a)-v.bg;
}
template<class t>
bool bis(const vc<t>&v,const t&a){
return binary_search(all(v),a);
}
vvc<int> readGraph(int n,int m){
vvc<int> g(n);
rep(i,m){
int a,b;
cin>>a>>b;
//sc.read(a,b);
a--;b--;
g[a].pb(b);
g[b].pb(a);
}
return g;
}
vvc<int> readTree(int n){
return readGraph(n,n-1);
}
vc<ll> presum(const vi&a){
vc<ll> s(si(a)+1);
rep(i,si(a))s[i+1]=s[i]+a[i];
return s;
}
//BIT で数列を管理するときに使う (CF850C)
template<class t>
vc<t> predif(vc<t> a){
gnr(i,1,si(a))a[i]-=a[i-1];
return a;
}
template<class t>
vvc<ll> imos(const vvc<t>&a){
int n=si(a),m=si(a[0]);
vvc<ll> b(n+1,vc<ll>(m+1));
rep(i,n)rep(j,m)
b[i+1][j+1]=b[i+1][j]+b[i][j+1]-b[i][j]+a[i][j];
return b;
}
//verify してないや
void transvvc(int&n,int&m){
swap(n,m);
}
template<class t,class... Args>
void transvvc(int&n,int&m,vvc<t>&a,Args&...args){
assert(si(a)==n);
vvc<t> b(m,vi(n));
rep(i,n){
assert(si(a[i])==m);
rep(j,m)b[j][i]=a[i][j];
}
a.swap(b);
transvvc(n,m,args...);
}
//CF854E
void rotvvc(int&n,int&m){
swap(n,m);
}
template<class t,class... Args>
void rotvvc(int&n,int&m,vvc<t>&a,Args&...args){
assert(si(a)==n);
vvc<t> b(m,vi(n));
rep(i,n){
assert(si(a[i])==m);
rep(j,m)b[m-1-j][i]=a[i][j];
}
a.swap(b);
rotvvc(n,m,args...);
}
//ソートして i 番目が idx[i]
//CF850C
template<class t>
vi sortidx(const vc<t>&a){
int n=si(a);
vi idx(n);iota(all(idx),0);
sort(all(idx),[&](int i,int j){return a[i]<a[j];});
return idx;
}
//vs[i]=a[idx[i]]
//例えば sortidx で得た idx を使えば単にソート列になって返ってくる
//CF850C
template<class t>
vc<t> a_idx(const vc<t>&a,const vi&idx){
int n=si(a);
assert(si(idx)==n);
vc<t> vs(n);
rep(i,n)vs[i]=a[idx[i]];
return vs;
}
//CF850C
vi invperm(const vi&p){
int n=si(p);
vi q(n);
rep(i,n)q[p[i]]=i;
return q;
}
template<class t,class s=t>
s SUM(const vc<t>&a){
return accumulate(all(a),s(0));
}
template<class t>
t MAX(const vc<t>&a){
return *max_element(all(a));
}
template<class t>
t MIN(const vc<t>&a){
return *min_element(all(a));
}
template<class t>
pair<t,int> MINi(const vc<t>&a){
auto itr=min_element(all(a));
return mp(*itr,itr-a.bg);
}
template<class t,class u>
pair<t,u> operator+(const pair<t,u>&a,const pair<t,u>&b){
return mp(a.a+b.a,a.b+b.b);
}
vi vid(int n){
vi res(n);iota(all(res),0);
return res;
}
template<class S>
S getrev(S s){
reverse(all(s));
return s;
}
pi operator+(pi a,pi b){return pi(a.a+b.a,a.b+b.b);}
template<class t>
t gpp(vc<t>&vs){
assert(si(vs));
t res=move(vs.back());
vs.pop_back();
return res;
}
//copy-constructor,使えません
//find は lazy と組み合わせても動く (Petrozavodsk 2020w Day9 C)
//reverse は未知数
//erase,insert は動く
//split_cmp も動く
//max_right も動く
//AOJ DSL2G
template<class N>
struct splaytree{
struct Node{
using np=Node*;
np l,r,p;
bool rev;
N x;
Node():l(0),r(0),p(0),rev(false),x(){}
void clear(){
l=0;
r=0;
p=0;
rev=0;
}
void reverse(){
rev^=true;
swap(l,r);
x.reverse();
}
void push(){
if(rev){
if(l)l->reverse();
if(r)r->reverse();
rev=false;
}
if(l)x.pushl(l->x);
if(r)x.pushr(r->x);
x.clear();
}
np update(){
x.single();
if(l)x.updatel(l->x);
if(r)x.updater(r->x);
return this;
}
int pos(){
if(p&&p->l==this)return -1;
if(p&&p->r==this)return 1;
return 0;
}
void prepare(){
if(pos())
p->prepare();
push();
}
void rotate(){
np q=p,c;
if(pos()==1){
c=l;
l=p;
p->r=c;
}else{
c=r;
r=p;
p->l=c;
}
if(c)c->p=p;
p=p->p;
q->p=this;
if(p&&p->l==q)p->l=this;
if(p&&p->r==q)p->r=this;
q->update();
}
np splay(){
prepare();
while(pos()){
int a=pos(),b=p->pos();
if(b&&a==b)p->rotate();
if(b&&a!=b)rotate();
rotate();
}
return update();
}
/* deprecated
template<class F,class...Args>
np find(F f,Args&&...args){
if(!(x.*f)(forward<Args>(args)...))return 0;
push();
x.single();
np a=0;
if(l)a=l->find(f,forward<Args>(args)...);
if(a)return a;
if((x.*f)(forward<Args>(args)...))return splay();
return r->find(f,forward<Args>(args)...);
}*/
np left(){
if(l)return l->left();
else return splay();
}
np right(){
if(r)return r->right();
else return splay();
}
/*np root(){
if(p)return p->root();
else return this;
}*/
void chpar(np c){
if(c){
assert(!(c->p));
c->p=this;
}
}
np linkl(np c){
assert(!l);
chpar(l=c);
return update();
}
np linkr(np c){
assert(!r);
chpar(r=c);
return update();
}
np linklr(np c,np d){
assert(!l&&!r);
chpar(l=c);
chpar(r=d);
return update();
}
np cutl(){
if(l){
l->p=0;
l=0;
}
return update();
}
np cutr(){
if(r){
r->p=0;
r=0;
}
return update();
}
//XIX Opencup GP of Zhejiang A
np get_next(){
splay();
if(!r)return 0;
else return r->left();
}
//linkcut 用
void expose(){
for(np a=this;a;a=a->p)a->splay();
for(np a=this;a->p;a=a->p){
a->p->r=a;
a->p->update();
}
splay();
}
void evert(){
expose();
if(l){
l->reverse();
l=0;
update();
}
}
void LClink(np a){
evert();
p=a;
}
void LCcutchild(){
expose();
r=0;
update();
}
void LCcutpar() {
expose();
assert(l);
l->p=0;
l=0;
update();
}
};
using np=Node*;
np head;
int alloc_total=0;
splaytree(const splaytree&)=delete;
void operator=(const splaytree&)=delete;
splaytree():head(0){}
~splaytree(){
int del_total=0;
while(head){
del_total++;
np nx=head->p;
delete head;
head=nx;
}
assert(alloc_total==del_total);
}
//TL,MLが厳しいとき
//FHC2022 Final E
//もともと 118 秒くらいのコードが 98 秒になったが…
/*splaytree(){
const int S=20000000;
np buf=new Node[S];
buf[0].p=0;
rng(i,1,S)buf[i].p=buf+(i-1);
head=buf+(S-1);
}
~splaytree(){}*/
np allocnode(){
if(head){
np res=head;
head=res->p;
return res;
}else{
alloc_total++;
return new Node();
}
}
//読んだ直後,x->p 以外の情報は生きている
void freenode(np x){
x->p=head;
head=x;
}
/*vc<np> ps;
unique_ptr<Node[]> buf;
splaytree(int n):buf(new Node[n]),ps(n){
rep(i,n)ps[i]=buf.get()+i;
}
//alloc/free 系書いてないわ
*/
//FHC2022 Final E/range_set/rect_set
//assume no duplicate free
void freetree(np x){
if(!x)return;
freetree(x->l);
freetree(x->r);
freenode(x);
//ps.pb(x);
}
template<class...Args>
np nn(Args&&...args){
np a=allocnode();
a->l=0;
a->r=0;
a->p=0;
a->x=N(forward<Args>(args)...);
return a;
}
np merge(np a,np b){
if(!a)return b;
if(!b)return a;
return b->splay()->left()->linkl(a->splay());
}
//GCJ2022 Round2 D
template<class...Args>
np merge(np a,np b,Args...args){
return merge(merge(a,b),args...);
}
template<bool C,class F,class...Args>
pair<np,np> max_right_sub(np a,F f,Args&&...args){
N cur;
np x=0,y=0;
while(a){
a->push();
N nx=a->x;nx.single();
if(a->l)nx.updatel(a->l->x);
nx.updatel(cur);
if((nx.*f)(forward<Args>(args)...)){
cur=nx;
x=a;
a=a->r;
}else{
y=a;
a=a->l;
}
}
if(x){
x->splay();
if constexpr(C)x->cutr();
}
if(y)y->splay();
return mp(x,y);
}
//max_right で失敗する最初のノードを根にする
//そのようなものがない場合は false が返ってくる
template<class F,class...Args>
bool max_right_splay(np&a,F f,Args&&...args){
auto [x,y]=max_right_sub<false>(a,f,forward<Args>(args)...);
if(y){
a=y;
return true;
}else{
a=x;
return false;
}
}
//分けた列の右端と左端が返ってくる
//CF Dytechlab Cup 2022 G (lazy あり)
template<class F,class...Args>
pair<np,np> max_right_split(np a,F f,Args&&...args){
return max_right_sub<true>(a,f,forward<Args>(args)...);
}
//XX Opencup GP of Wroclaw D
//分けた列の右端と左端が返ってくる
//CF740 D (lazy あり)
//CF Dytechlab Cup 2022 G (lazy あり)
template<bool C,class F,class T>
static pair<np,np> split_sub(np a,F cmp,T v){
np x=0,y=0;
while(a){
a->push();
if(cmp(a->x,v)){
x=a;
a=a->r;
}else{
y=a;
a=a->l;
}
}
if(x){
x->splay();
if constexpr(C)x->cutr();
}
if(y)y->splay();
return mp(x,y);
}
template<class F,class T>
pair<np,np> split_cmp(np a,F cmp,T v){
return split_sub<true>(a,cmp,v);
}
//cmp(x,v)=false になる最初の x を根にして返す
//そのようなものがない場合は false が返ってくる
//FHC2022 Final E/range_set/rect_set
template<class F,class T>
bool lower_bound_cmp(np&a,F cmp,T v){
auto [x,y]=split_sub<false>(a,cmp,v);
if(y){
a=y;
return true;
}else{
//not verified?
a=x;
return false;
}
}
//XIX Opencup GP of Zhejiang A
//FHC2022 Final E/range_set/rect_set
template<class F>
void insert_cmp(np&x,F cmp,np v){
assert(!v->l&&!v->r&&!v->p&&!v->rev);
//auto [a,b]=split_cmp(x,f,v->x);
//x=v->linklr(a,b);
if(!x){
x=v;
return;
}else{
np p=0;
bool l;
while(x){
x->push();
p=x;
if(cmp(x->x,v->x)){
l=false;
x=x->r;
}else{
l=true;
x=x->l;
}
}
if(l){
p->linkl(v);
}else{
p->linkr(v);
}
x=v->splay();
}
}
//XX Opencup GP of Wroclaw D
//FHC2022 Final E/range_set/rect_set
template<class F,class...Args>
void emplace_cmp(np&x,F f,Args&&...args){
insert_cmp(x,f,nn(forward<Args>(args)...));
}
//FHC2022 Final E/range_set/rect_set
template<class...Args>
void emplace(np&x,Args&&...args){
emplace_cmp(x,less<N>(),forward<Args>(args)...);
}
//XX Opencup GP of Wroclaw D
pair<np,np> erase_sub(np x){
x->splay();
if(x->l)x->l->p=0;
if(x->r)x->r->p=0;
freenode(x);
return mp(x->l,x->r);
}
//CF Dytechlab Cup 2022 G
void erase(np&x){
auto [a,b]=erase_sub(x);
x=merge(a,b);
}
//FHC2022 Final E/range_set/rect_set
//less,eq,
template<class F,class T,class G>
bool erase_cmp_eq(np&x,F f,G g,T v){
if(lower_bound_cmp(x,f,v)&&g(x->x,v)){
erase(x);
return true;
}
return false;
}
//FHC2022 Final E/range_set/rect_set
template<class T>
bool erase(np&x,T v){
return erase_cmp_eq(x,less<N>(),equal_to<N>(),v);
}
//Petrozavodsk 2020w Day9 H
np isolate(np x){
x->splay();
if(x->l)x->l->p=0;
if(x->r)x->r->p=0;
np res=merge(x->l,x->r);
x->x.single();
x->clear();
return res;
}
template<class t>
np build(vc<t> v){
vc<np> cur;
for(auto z:v)cur.pb(nn(z));
while(cur.size()>1){
int s=cur.size();
vc<np> nx((s+1)/2);
for(int i=0;i<s;i+=2){
if(i+1<s)nx[i/2]=merge(cur[i],cur[i+1]);
else nx[i/2]=cur[i];
}
swap(nx,cur);
}
return cur[0];
}
/*
//NOT VERIFIED
//lower_bound したものを根に移して node を返す.
//lower_bound の結果が end だと空が返ってくるらしい
//USACO2021 USOPEN Platinum A
template<class F>
np lower_bound_cmp(np a,F cmp,N v){
auto [x,y]=split_cmp(a,cmp,v);
np res=nullptr;
if(y)res=y->left();
merge(x,res);
if(res)res->splay();
return res;
}
*/
//XIX Opencup GP of Zhejiang A
//a-b なる部分を取り出し,x,y(a-b),z を返す
//a と b が異なる木に属する,また,a と b の順序がおかしい場合,何が起きるかは不明
tuple<np,np,np> split_range(np a,np b){
{//debug
a->splay();
b->splay();
int lastpos;
auto c=a;
while(c&&c!=b){
lastpos=c->pos();
c=c->p;
}
assert(c==b);
assert(lastpos==-1);
}
a->splay();
np x=a->l;
a->cutl();
b->splay();
np z=b->r;
b->cutr();
return mt(x,b,z);
}
//CF743F(TLE)
//The 2022 ICPC Asia Nanjing Regional Contest H
template<class F>
void weighted_merge_rec_cmp(np&tar,F f,np x){
if(!x)return;
x->push();
np l=x->l,r=x->r;
x->x.single();
x->clear();
weighted_merge_rec_cmp(tar,f,l);
insert_cmp(tar,f,x);
weighted_merge_rec_cmp(tar,f,r);
}
template<class F>
np weighted_merge_cmp(np a,F f,np b){
if(!a)return b;
if(!b)return a;
if(a->x.len<b->x.len)swap(a,b);
weighted_merge_rec_cmp(a,f,b);
return a;
}
//Petrozavodsk 2020w Day9 C
void enumerate(np x,vc<N>&dst){
if(!x)return;
x->push();
enumerate(x->l,dst);
dst.pb(x->x);
enumerate(x->r,dst);
}
/* deprecated
//Petrozavodsk 2020w Day9 H
template<class F>
np insert(np r,np x,F f){
np a,b;tie(a,b)=split(r,f,x->x);
return merge(merge(a,x),b);
}
template<class F,class...Args>
np insert(np r,F f,Args&&...args){
np x=nn(forward<Args>(args)...);
np a,b;tie(a,b)=split(r,f,x->x);
return merge(merge(a,x),b);
}
//左の列の根は右端とは限らない!
//右の列の根は左端だと思う
template<class F,class...Args>
pair<np,np> split(np a,F f,Args&&...args){
if(!a)return {0,0};
np b=a->find(f,forward<Args>(args)...);
if(b){
np c=b->l;
return {c,b->cutl()};
}
return {a,0};
}
//GCJ2022 Round2 D
tuple<np> split_by_len(np a){
return a;
}
template<class...Args>
auto split_by_len(np a,int len,Args...args){
assert((!a&&len==0)||inc(0,len,a->x.len));
auto [b,c]=split(a,&N::find_by_len,len);
assert(len==0);
return tuple_cat(tuple{b},split_by_len(c,args...));
}
//Petrozavodsk 2020w Day9 C
template<class F>
np weighted_merge_rec(np x,np tar,F f){
if(!x)return tar;
x->push();
tar=weighted_merge_rec(x->l,tar,f);
tar=weighted_merge_rec(x->r,tar,f);
x->x.single();
x->clear();
return insert(tar,x,f);
}
//Petrozavodsk 2020w Day9 C
template<class F>
np weighted_merge(np a,np b,F f){
if(!a)return b;
if(!b)return a;
if(a->x.sz<b->x.sz)swap(a,b);
return weighted_merge_rec(b,a,f);
}
*/
};
//デフォルトコンストラクターが null node になっているべき (例えば len=0)
//N::reverse
//N::push→ pushl,pushr
//副作用なし,1個の子にpush
//N::clear
//lazy tagを消去
//N::single
//ノード単体の情報を元に部分木情報を初期化
//N::updatel,updater
//N::find
//find はその部分木内に目標とするノードがあるかどうかを返す
//split のやり方を変えたい
//max_right のノリで split をする
//split_cmp は cmp(x,v) が true になる最大の x を見つけてそれで分離
//↓deprecared
//split は find で見つけたものが右の部分木の left になるように分離する
//普通に a<b を渡すと lower_bound と同じ効果が得られる
//split_by_len で左 len 個とそれ以外に分離する
//find_by_len という比較関数が定義されていないと破壊
//multiset<int> で値の sum が取れるだけ
template<int K>
struct N{
using A=array<uint,K>;
int key;
A val,sum;
N(){}
N(int k,A v):key(k),val(v){single();}
void reverse(){}
void pushl(N&){
}
void pushr(N&){
}
void clear(){
}
void single(){
sum=val;
}
void update(const N&x){
rep(i,K)sum[i]+=x.sum[i];
}
void updatel(const N&x){update(x);}
void updater(const N&x){update(x);}
bool operator<(const N&r)const{
return key<r.key;
}
uint eval(ull x){
return sum[0]+sum[1]*x;
}
};
void slv(){
int n,m;sc.read(n,m);
//2^30
splaytree<N<2>> t;
using np=decltype(t)::np;
np root=nullptr;
uint ans=0;
rng(i,1,n+1){
uint p,q;sc.read(p,q);
p=(p+ans)&mask(m);
q=(q+ans)&mask(m);
uint l,r;tie(l,r)=minmax(p,q);
r++;
dmp2(l,r);
uint sum=uint(i)*(r-l);
{
auto [x,y]=t.split_cmp(root,less<N<2>>(),N<2>(l,{}));
if(x)sum-=x->x.eval(l);
root=t.merge(x,y);
}
{
auto [x,y]=t.split_cmp(root,less<N<2>>(),N<2>(r,{}));
if(x)sum+=x->x.eval(r);
root=t.merge(x,y);
}
ans+=sum;
t.emplace(root,l,N<2>::A{-(uint)i*l,(uint)i});
t.emplace(root,r,N<2>::A{(uint)i*r,-(uint)i});
}
pr.writeln(ans&mask(30));
t.freetree(root);
}
signed main(){
cin.tie(0);
ios::sync_with_stdio(0);
cout<<fixed<<setprecision(20);
//int t;cin>>t;rep(_,t)
slv();
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3460kb
input:
5 2 2 1 1 3 3 2 1 0 0 2
output:
87
result:
ok 1 number(s): "87"
Test #2:
score: 0
Accepted
time: 2ms
memory: 3484kb
input:
1 1 1 1
output:
1
result:
ok 1 number(s): "1"
Test #3:
score: 0
Accepted
time: 2ms
memory: 3324kb
input:
1 2 3 1
output:
3
result:
ok 1 number(s): "3"
Test #4:
score: 0
Accepted
time: 2ms
memory: 3412kb
input:
1 5 31 15
output:
17
result:
ok 1 number(s): "17"
Test #5:
score: 0
Accepted
time: 2ms
memory: 3472kb
input:
1 20 366738 218765
output:
147974
result:
ok 1 number(s): "147974"
Test #6:
score: 0
Accepted
time: 2ms
memory: 3368kb
input:
1 30 86669484 41969116
output:
44700369
result:
ok 1 number(s): "44700369"
Test #7:
score: 0
Accepted
time: 0ms
memory: 3436kb
input:
10 5 20 31 2 2 14 18 13 25 26 4 22 9 15 9 19 16 15 27 9 20
output:
1414
result:
ok 1 number(s): "1414"
Test #8:
score: 0
Accepted
time: 2ms
memory: 3424kb
input:
100 10 245 987 817 813 743 560 548 504 116 479 223 199 775 998 126 542 791 823 96 318 69 349 0 584 245 601 119 513 93 820 115 307 838 978 249 767 433 287 240 8 22 683 169 720 395 592 903 866 919 652 510 563 858 345 938 250 550 239 981 7 784 926 212 644 272 365 490 871 470 987 571 53 65 593 515 370 1...
output:
20383734
result:
ok 1 number(s): "20383734"
Test #9:
score: 0
Accepted
time: 1ms
memory: 3576kb
input:
1000 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1 1 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1...
output:
190098735
result:
ok 1 number(s): "190098735"
Test #10:
score: 0
Accepted
time: 1ms
memory: 3536kb
input:
1000 5 8 18 31 28 19 3 15 28 5 22 19 1 26 27 17 17 5 26 6 27 10 6 5 2 3 19 6 6 28 16 17 16 0 21 7 31 13 25 13 10 28 30 0 13 21 5 2 9 25 28 4 18 31 13 1 26 30 3 5 8 19 16 22 10 15 17 3 25 6 27 18 26 27 1 26 29 18 21 14 20 5 1 26 9 7 13 19 25 15 11 24 17 12 28 24 17 4 27 20 27 31 18 25 17 1 28 5 0 16 ...
output:
794181769
result:
ok 1 number(s): "794181769"
Test #11:
score: 0
Accepted
time: 3ms
memory: 3660kb
input:
1000 10 732 399 190 578 491 867 330 55 113 400 34 734 790 927 201 156 107 359 790 398 401 523 634 505 570 305 281 513 551 35 610 33 231 330 833 756 213 444 412 315 139 165 533 21 35 977 319 884 894 72 149 667 16 538 282 860 850 550 100 99 801 138 159 34 468 852 840 853 368 994 469 906 393 298 464 89...
output:
755182648
result:
ok 1 number(s): "755182648"
Test #12:
score: 0
Accepted
time: 8ms
memory: 4132kb
input:
5000 15 7705 10737 21186 31441 10307 825 19372 1969 32358 6343 22487 31897 12802 25210 17920 4297 5726 8409 28174 12489 16532 12646 9916 14917 19592 26927 23987 9279 26951 31081 3673 10505 20727 10730 28961 26581 11005 29624 13931 32180 29764 19108 23553 28977 30178 6537 25586 3041 15333 31927 4671 ...
output:
374742544
result:
ok 1 number(s): "374742544"
Test #13:
score: 0
Accepted
time: 22ms
memory: 4720kb
input:
10000 20 914013 637387 162942 785196 55799 893293 359726 714014 109456 559963 689320 161360 164737 25370 260018 436870 801394 34900 564741 620583 1008448 956143 788249 695007 633673 1020122 431990 397822 253241 746513 322933 927863 843120 378180 343689 583409 788822 249760 839003 753443 910418 20908...
output:
719391110
result:
ok 1 number(s): "719391110"
Test #14:
score: 0
Accepted
time: 329ms
memory: 15936kb
input:
100000 30 1063412225 224331901 116583527 514118426 121269548 678461017 856756753 250958443 1064104926 412721149 829078609 544244155 734000135 742933979 9127283 962205064 595091107 123655320 593251579 687018764 1052215261 661849950 297391487 243419322 105274358 526149321 1069300711 46673358 208918023...
output:
252791218
result:
ok 1 number(s): "252791218"
Test #15:
score: 0
Accepted
time: 905ms
memory: 28468kb
input:
200000 30 340892656 331749003 569148929 1001014926 169562315 65082998 783728999 371358574 1068579249 78668714 697845492 972638257 499257742 966955403 924540097 249425391 76210210 270676008 1055790206 117898225 186726707 639941146 774774929 469533012 608214477 15295274 30556605 466457599 892407954 78...
output:
220823398
result:
ok 1 number(s): "220823398"
Test #16:
score: 0
Accepted
time: 1496ms
memory: 40904kb
input:
300000 30 692114910 439166105 1021714331 414169601 217855081 525446803 710701245 491758705 1073053571 818358104 566612376 327290534 264515348 117235003 766211086 610387541 631071137 417696697 444587009 622519510 394979978 618032341 178416548 695646703 37412772 578183052 65554323 886241839 502156061 ...
output:
501248752
result:
ok 1 number(s): "501248752"
Test #17:
score: 0
Accepted
time: 2283ms
memory: 53392kb
input:
400000 30 1043337164 546583208 400537910 901066101 266147848 985810608 637673490 612158836 3786069 484305669 435379259 755684636 29772955 341256427 607882075 971349692 112190239 564717385 907125636 53398971 603233248 596123536 655799990 921760394 540352891 67329005 100552041 232284256 111904168 9990...
output:
828770668
result:
ok 1 number(s): "828770668"
Test #18:
score: 0
Accepted
time: 2926ms
memory: 65944kb
input:
500000 30 320817594 654000310 853103312 314220777 314440615 372432589 564645736 732558967 8260392 150253235 304146143 110336914 868772386 565277851 449553064 258570018 667051166 711738073 295922440 558020255 811486519 574214731 59441609 74132260 1043293010 630216783 135549759 652068497 795394100 298...
output:
906730214
result:
ok 1 number(s): "906730214"
Test #19:
score: 0
Accepted
time: 282ms
memory: 70692kb
input:
500000 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 1...
output:
181097888
result:
ok 1 number(s): "181097888"
Test #20:
score: 0
Accepted
time: 421ms
memory: 68776kb
input:
500000 2 1 2 0 1 0 2 3 3 2 1 2 3 0 2 3 2 2 3 1 3 0 2 1 1 1 1 3 1 3 1 2 3 1 2 3 0 3 3 0 2 3 3 0 3 0 0 1 3 1 2 1 3 2 0 2 1 1 2 1 3 3 0 2 1 1 2 3 3 1 3 0 2 3 2 0 0 3 0 1 1 2 2 0 2 2 1 2 1 1 2 2 3 1 3 2 2 1 3 1 0 0 0 0 1 1 1 3 3 0 1 1 3 0 3 1 2 2 1 2 1 2 1 1 3 2 3 1 0 2 3 3 0 0 1 0 1 3 1 2 1 3 0 2 1 0 0...
output:
687623855
result:
ok 1 number(s): "687623855"
Test #21:
score: 0
Accepted
time: 715ms
memory: 66324kb
input:
500000 5 14 22 17 2 15 11 17 5 17 15 22 3 11 31 2 28 12 3 15 31 22 24 20 3 30 10 14 25 4 24 4 27 23 10 8 23 27 30 2 0 23 19 7 17 9 12 0 17 18 15 16 8 25 4 21 17 1 15 28 16 0 17 6 10 12 25 27 14 4 10 13 4 2 7 11 0 26 14 5 31 5 3 3 23 25 9 30 13 8 27 4 17 31 3 22 17 20 28 0 10 19 3 6 28 8 27 18 15 25 ...
output:
622835418
result:
ok 1 number(s): "622835418"
Test #22:
score: 0
Accepted
time: 1178ms
memory: 65896kb
input:
500000 10 856 970 406 443 765 933 624 432 886 497 85 266 923 446 574 385 406 670 919 782 980 995 653 372 306 566 872 763 820 655 940 777 912 341 566 196 377 90 112 151 791 392 683 663 265 918 544 653 478 477 865 495 731 163 1005 983 207 265 351 501 836 663 145 960 703 609 492 802 854 827 788 98 590 ...
output:
188485208
result:
ok 1 number(s): "188485208"
Test #23:
score: 0
Accepted
time: 2137ms
memory: 65936kb
input:
500000 15 27436 19759 17989 14016 29351 9027 22878 23375 493 27515 23549 24903 315 23061 25757 17058 1864 7051 30102 6834 11360 31682 17857 13340 18416 7677 14292 14102 31283 32432 29118 21540 3743 12654 29341 26640 17415 1416 9602 20812 8260 18798 2549 31524 31630 17713 19078 12150 27310 177 10790 ...
output:
1032744914
result:
ok 1 number(s): "1032744914"
Test #24:
score: 0
Accepted
time: 2982ms
memory: 66060kb
input:
500000 20 595399 816452 624541 904856 21003 135407 71017 55007 982408 852317 192118 714368 372925 504868 1038018 323825 533838 690687 615209 673098 374113 789997 887853 227012 666338 73589 1037373 185087 283957 874396 942111 213879 106795 840613 81434 235343 796353 760221 217814 465288 11787 68789 5...
output:
409536009
result:
ok 1 number(s): "409536009"
Test #25:
score: 0
Accepted
time: 2904ms
memory: 65976kb
input:
500000 25 19067802 14544791 25094922 28771765 5655376 16549409 5245489 11514410 2880479 5597148 27471827 6089281 15538101 25124497 7207909 15185410 5672258 7360080 20385827 2897907 25020895 25107624 25287245 8713330 30138363 25200774 19229689 28894790 14249446 6164467 29132724 3420898 10899764 28675...
output:
780249768
result:
ok 1 number(s): "780249768"
Test #26:
score: -100
Time Limit Exceeded
input:
500000 28 152614559 168140428 64224198 121918464 122849778 83659627 217295184 192622378 261781773 101788852 214755856 129277082 195293407 29297446 93882848 198320685 259042706 149180743 166442363 41079386 101742327 253721117 26241171 237722709 122360149 203892353 33112297 72988388 192464090 15934624...