CSES - Siperia opettaa 2.0 - Results
Submission details
Task:Youngling tournament
Sender:zxc
Submission time:2016-07-28 18:13:21 +0300
Language:C++
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED100
Test results
testverdicttime
#1ACCEPTED0.05 sdetails
#2ACCEPTED0.05 sdetails
#3ACCEPTED0.06 sdetails
#4ACCEPTED0.05 sdetails
#5ACCEPTED0.06 sdetails
#6ACCEPTED0.05 sdetails
#7ACCEPTED0.05 sdetails
#8ACCEPTED0.05 sdetails
#9ACCEPTED0.06 sdetails
#10ACCEPTED0.06 sdetails
#11ACCEPTED0.06 sdetails
#12ACCEPTED0.06 sdetails
#13ACCEPTED0.05 sdetails
#14ACCEPTED0.06 sdetails
#15ACCEPTED0.06 sdetails
#16ACCEPTED0.06 sdetails
#17ACCEPTED0.05 sdetails
#18ACCEPTED0.06 sdetails
#19ACCEPTED0.06 sdetails
#20ACCEPTED0.06 sdetails
#21ACCEPTED0.12 sdetails
#22ACCEPTED0.12 sdetails
#23ACCEPTED0.11 sdetails
#24ACCEPTED0.12 sdetails
#25ACCEPTED0.12 sdetails
#26ACCEPTED0.10 sdetails
#27ACCEPTED0.59 sdetails
#28ACCEPTED0.59 sdetails
#29ACCEPTED0.57 sdetails
#30ACCEPTED0.61 sdetails
#31ACCEPTED0.76 sdetails
#32ACCEPTED0.63 sdetails
#33ACCEPTED0.65 sdetails
#34ACCEPTED0.64 sdetails
#35ACCEPTED0.60 sdetails
#36ACCEPTED0.67 sdetails
#37ACCEPTED0.66 sdetails
#38ACCEPTED0.67 sdetails
#39ACCEPTED0.55 sdetails
#40ACCEPTED0.64 sdetails
#41ACCEPTED0.60 sdetails
#42ACCEPTED0.99 sdetails
#43ACCEPTED0.70 sdetails
#44ACCEPTED0.60 sdetails
#45ACCEPTED0.43 sdetails
#46ACCEPTED0.41 sdetails
#47ACCEPTED0.38 sdetails
#48ACCEPTED0.41 sdetails
#49ACCEPTED0.40 sdetails
#50ACCEPTED0.43 sdetails
#51ACCEPTED0.66 sdetails
#52ACCEPTED0.56 sdetails
#53ACCEPTED0.64 sdetails
#54ACCEPTED0.68 sdetails
#55ACCEPTED0.71 sdetails
#56ACCEPTED0.68 sdetails
#57ACCEPTED0.68 sdetails
#58ACCEPTED0.67 sdetails
#59ACCEPTED0.70 sdetails
#60ACCEPTED0.78 sdetails
#61ACCEPTED0.80 sdetails
#62ACCEPTED0.76 sdetails
#63ACCEPTED0.60 sdetails
#64ACCEPTED0.65 sdetails
#65ACCEPTED0.64 sdetails
#66ACCEPTED1.14 sdetails
#67ACCEPTED0.81 sdetails
#68ACCEPTED0.64 sdetails
#69ACCEPTED0.50 sdetails
#70ACCEPTED0.44 sdetails
#71ACCEPTED0.43 sdetails
#72ACCEPTED0.50 sdetails
#73ACCEPTED0.47 sdetails
#74ACCEPTED0.51 sdetails

Compiler report

input/code.cpp: In function 'void solve()':
input/code.cpp:147:6: warning: unused variable 'lo' [-Wunused-variable]
  int lo = 0;
      ^
input/code.cpp:148:6: warning: unused variable 'hi' [-Wunused-variable]
  int hi = pos;
      ^

Code

#include <bits/stdc++.h>
#define F first
#define S second
using namespace std;
typedef long long ll;
const int N = 1<<17;
struct Node {
    pair<ll, ll> val;
    ll prior;
    int cnt;
    ll sum;
    ll ma;
    Node * left;
    Node * right;
    Node(ll v, ll i) {
	val = {v, i};
	sum = 0;
	ma = 0;
	prior = rand();
	cnt = 1;
	left = right = NULL;
    }
};
Node * root;
int cnt(Node * a) {
    if(a == NULL) return 0;
    return a->cnt;
}
ll sum(Node * a) {
    if(a == NULL) return 0;
    return a->sum;
}
ll ma(Node * a) {
    if(a == NULL) return 0;
    return a->ma;
}
void upd(Node * a) {
    if(a == NULL) return;
    a->cnt = cnt(a->left) + cnt(a->right) + 1;
    a->sum = sum(a->left) + sum(a->right) + a->val.F;
    a->ma = max(ma(a->left), max(ma(a->right), a->val.F));
}
void split(Node* k, Node*& l, Node*& r, int c) {
    if(k == NULL) {
	l = r = NULL;
    }
    else {
	if(cnt(k->left) + 1 <= c) {
	    split(k->right, k->right, r, c - cnt(k->left)-1);
	    l = k;
	}
	else {
	    split(k->left, l, k->left, c);
	    r = k;
	}
    }
    upd(k);
}
void print(Node * a) {
    if(a == NULL) return;
    print(a->left);
    cout<<a->val.F<<' ';
    print(a->right);
}
void merge(Node*& k, Node* l, Node* r) {
    if(l == NULL) {
	k = r;
    }
    else if(r == NULL) {
	k = l;
    }
    else {
	if(l->prior < r->prior) {
	    merge(l->right, l->right, r);
	    k = l;
	}
	else {
	    merge(r->left, l, r->left);
	    k = r;
	}
    }
    upd(k);
}
int n;
ll getSum(Node * k, int x, int y, int cSum) {
    if(k == NULL) return 0;
    //cout<<k->val.F<<endl;
    int l = cSum;
    int r = cSum + cnt(k) - 1;
    if(l > y || r < x) return 0;
    if(l >= x && r <= y) {
	return k->sum;
    }
    ll mid = cSum + cnt(k->left);
    ll q = getSum(k->left, x, y, cSum);
    ll w = getSum(k->right, x, y, cSum+cnt(k->left)+1);
    if(mid >= x && mid <= y) {
	q += k->val.F;
    }
    return q + w;
}
ll getMax(Node * k, int x, int y, int cSum) {
    if(k == NULL) return -1e18;
    int l = cSum;
    int r = cSum + cnt(k) - 1;
    if(l > y || r < x) return -1e18;
    if(l >= x && r <= y) {
	return k->ma;
    }
    ll mid = cSum + cnt(k->left);
    ll q = getMax(k->left, x, y, cSum);
    ll w = getMax(k->right, x, y, cSum+cnt(k->left)+1);
    if(mid >= x && mid <= y) {
	q = max(q, k->val.F);

    }
    return max(q,w);
}
int find(Node * a, ll sum, ll cSum, ll q) {
    ll pos = cSum + cnt(a->left) + 1;
    if(a == NULL) {
	return -1e9;
    }
    if(pos-2 <= q) {
	if(pos-2 < q && ma(a->right) >= sum) {
	    return find(a->right, sum, cSum + cnt(a->left)+1, q);
	}
	if(a->val.F >= sum) {
	    return cSum + cnt(a->left)+1;
	}
	return find(a->left, sum, cSum, q);
    }
    else {
	return find(a->left, sum, cSum, q);
    }
}
void solve() {
    ll sum = getSum(root, n-1, n-1, -1);
    int pos = n-2;
    int ans = 1;
    //cout<<"ASDASD\n";
    //cout<<sum<<'\n';
    //print(root);
    //cout<<endl;
    while(pos >= 0) {
//	cout<<pos<<' ';
	int lo = 0;
	int hi = pos;
	int best = -1;
	best = find(root, sum, 0, pos)-2;
//	cout<<sum<<' '<<pos<<' '<<best<<'\n';

	/*
	while(lo <= hi) {
	    int mid = (lo+hi)/2;
//	    cout<<"lol "<<mid<<' '<<getMax(root, mid, pos, -1)<<' '<<sum<<'\n';
	    if(getMax(root, mid, pos, -1) >= sum) {
		lo = mid+1;
		best = mid;
	    }
	    else {
		hi = mid-1;
	    }
	}
	*/
//	cout<<best<<'\n';
//	cout<<'\n';
	if(best == -1) break;
	sum = getSum(root, best+1, n-1, -1);
	if(getMax(root, best, best, -1) >= sum) {
	    ++ans;
	}
	sum = getSum(root, best, n-1, -1);
	pos = best-1;
    }
    cout<<ans<<'\n';
}
int findPos(Node* k, pair<ll, ll> val) {
    if(k == NULL) {
	return -1e9;
    }
    if(val <= k->val) {
	int q = findPos(k->right, val) + cnt(k->left) + 1;
	if(q < 0) {
	    return cnt(k->left) + 1;
	}
	return q;
    }
    return findPos(k->left, val);
}
void insert(Node*& root, Node * a) {
    int pos = findPos(root, a->val);
    Node * t1, *t2;
    split(root, t1, t2, pos);
    merge(t1, t1, a);
    merge(root, t1, t2);
}
Node * qwe[101010];
int main() {
    cin>>n;
    root = new Node({(ll)1e18, (ll)-1});
    root->prior = -1e18;
    for(int i = 0; i < n; ++i) {
	ll q;
	cin>>q;
	qwe[i] = new Node({(ll)q, i});
	insert(root, qwe[i]);
    }
//	print(root);
//	cout<<endl;;
    solve();
    int m;
    cin>>m;
    for(int i = 0; i< m; ++i) {
	ll k, f;
	cin>>k>>f;
	--k;
	//cout<<"QWEQWE "<<i<<'\n';
	int pos = findPos(root, qwe[k]->val);
	//cout<<pos<<'\n';

	Node * t1, *t2, *t3;
	split(root, t1, t3, pos);
	split(t1, t1, t2, pos-1);

	merge(root, t1, t3);
	qwe[k]->val.F = f;
	insert(root, qwe[k]);

//	print(root);
//	cout<<endl;;
	solve();
    }
}

Test details

Test 1

Verdict: ACCEPTED

input
3
2 1 3
3
1 3
2 7
...

correct output
3
2
3
2

user output
3
2
3
2

Test 2

Verdict: ACCEPTED

input
7
2 14 14 15 5 2 5
5
5 2
4 12
...

correct output
4
3
3
3
3
...

user output
4
3
3
3
3
...

Test 3

Verdict: ACCEPTED

input
10
1 3 40 6 2 20 7 79 80 100
10
9 58
10 40
...

correct output
7
6
6
6
5
...

user output
7
6
6
6
5
...

Test 4

Verdict: ACCEPTED

input
10
1 3 40 6 2 20 7 79 80 100
10
9 8
10 10
...

correct output
7
4
4
3
2
...

user output
7
4
4
3
2
...

Test 5

Verdict: ACCEPTED

input
10
1 3 40 6 2 20 7 79 80 100
10
9 80
10 4
...

correct output
7
7
3
2
4
...

user output
7
7
3
2
4
...

Test 6

Verdict: ACCEPTED

input
10
1 3 100 47 95 3 2 2 24 12
10
10 56
1 52
...

correct output
6
4
4
4
3
...

user output
6
4
4
4
3
...

Test 7

Verdict: ACCEPTED

input
10
1 3 100 47 95 3 2 2 24 12
10
10 6
1 2
...

correct output
6
5
5
5
4
...

user output
6
5
5
5
4
...

Test 8

Verdict: ACCEPTED

input
10
1 3 100 47 95 3 2 2 24 12
10
10 91
2 2
...

correct output
6
5
5
5
4
...

user output
6
5
5
5
4
...

Test 9

Verdict: ACCEPTED

input
100
189 48 295 293 281 74 10000 10...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 10

Verdict: ACCEPTED

input
100
189 48 295 293 281 74 10000 10...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 11

Verdict: ACCEPTED

input
100
189 48 295 293 281 74 10000 10...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 12

Verdict: ACCEPTED

input
100
37 10000 10000 10000 137 58 10...

correct output
5
4
4
4
3
...

user output
5
4
4
4
3
...

Test 13

Verdict: ACCEPTED

input
100
37 10000 10000 10000 137 58 10...

correct output
5
2
2
2
2
...

user output
5
2
2
2
2
...

Test 14

Verdict: ACCEPTED

input
100
37 10000 10000 10000 137 58 10...

correct output
5
2
2
2
2
...

user output
5
2
2
2
2
...

Test 15

Verdict: ACCEPTED

input
1000
117690 118480 116698 116498 73...

correct output
3
3
3
3
3
...

user output
3
3
3
3
3
...

Test 16

Verdict: ACCEPTED

input
1000
117690 118480 116698 116498 73...

correct output
3
2
2
2
2
...

user output
3
2
2
2
2
...

Test 17

Verdict: ACCEPTED

input
1000
117690 118480 116698 116498 73...

correct output
3
2
2
2
2
...

user output
3
2
2
2
2
...

Test 18

Verdict: ACCEPTED

input
1000
1709 376 1086 1000000 3107 278...

correct output
4
4
4
4
4
...

user output
4
4
4
4
4
...

Test 19

Verdict: ACCEPTED

input
1000
1000000 1000000 1000000 100000...

correct output
3
2
2
3
3
...

user output
3
2
2
3
3
...

Test 20

Verdict: ACCEPTED

input
1000
2951 1970 2237 1000000 1057 25...

correct output
3
3
3
3
3
...

user output
3
3
3
3
3
...

Test 21

Verdict: ACCEPTED

input
10000
1000000000 1000000000 5855 100...

correct output
3
3
3
3
3
...

user output
3
3
3
3
3
...

Test 22

Verdict: ACCEPTED

input
10000
1000000000 1000000000 5855 100...

correct output
3
2
2
2
2
...

user output
3
2
2
2
2
...

Test 23

Verdict: ACCEPTED

input
10000
1000000000 1000000000 5855 100...

correct output
3
2
2
2
2
...

user output
3
2
2
2
2
...

Test 24

Verdict: ACCEPTED

input
10000
19032 1470 1806 23678 10000000...

correct output
5
3
3
3
3
...

user output
5
3
3
3
3
...

Test 25

Verdict: ACCEPTED

input
10000
14039 13924 27761 8322 8912 68...

correct output
6
6
6
6
6
...

user output
6
6
6
6
6
...

Test 26

Verdict: ACCEPTED

input
10000
14880 1000000000 1000000000 10...

correct output
9
9
3
3
3
...

user output
9
9
3
3
3
...

Test 27

Verdict: ACCEPTED

input
50000
1000000000000 364674496414 128...

correct output
4
4
4
4
4
...

user output
4
4
4
4
4
...

Test 28

Verdict: ACCEPTED

input
50000
1000000000000 364674496414 128...

correct output
4
2
2
2
2
...

user output
4
2
2
2
2
...

Test 29

Verdict: ACCEPTED

input
50000
1000000000000 364674496414 128...

correct output
4
2
3
3
2
...

user output
4
2
3
3
2
...

Test 30

Verdict: ACCEPTED

input
50000
1000000000000 60494 106399 100...

correct output
12
11
10
10
10
...

user output
12
11
10
10
10
...

Test 31

Verdict: ACCEPTED

input
50000
137138 68579 80891 12876 12790...

correct output
12
3
3
3
3
...

user output
12
3
3
3
3
...

Test 32

Verdict: ACCEPTED

input
50000
1000000000000 18780 1000000000...

correct output
13
3
3
3
3
...

user output
13
3
3
3
3
...

Test 33

Verdict: ACCEPTED

input
50000
1000000000000 1000000000000 10...

correct output
4
4
4
4
4
...

user output
4
4
4
4
4
...

Test 34

Verdict: ACCEPTED

input
50000
1000000000000 1000000000000 10...

correct output
4
2
2
2
2
...

user output
4
2
2
2
2
...

Test 35

Verdict: ACCEPTED

input
50000
1000000000000 1000000000000 10...

correct output
4
2
2
2
2
...

user output
4
2
2
2
2
...

Test 36

Verdict: ACCEPTED

input
50000
29257 1000000000000 11645 2409...

correct output
14
14
14
12
12
...

user output
14
14
14
12
12
...

Test 37

Verdict: ACCEPTED

input
50000
14532 1000000000000 17273 2604...

correct output
13
2
2
2
2
...

user output
13
2
2
2
2
...

Test 38

Verdict: ACCEPTED

input
50000
1000000000000 13888 1000000000...

correct output
14
14
12
12
12
...

user output
14
14
12
12
12
...

Test 39

Verdict: ACCEPTED

input
50000
1000000000000 1000000000000 10...

correct output
6
6
6
6
5
...

user output
6
6
6
6
5
...

Test 40

Verdict: ACCEPTED

input
50000
1000000000000 1000000000000 10...

correct output
6
4
4
3
3
...

user output
6
4
4
3
3
...

Test 41

Verdict: ACCEPTED

input
50000
1000000000000 1000000000000 10...

correct output
6
3
3
3
3
...

user output
6
3
3
3
3
...

Test 42

Verdict: ACCEPTED

input
50000
1000000000000 1000000000000 10...

correct output
28
25
25
25
25
...

user output
28
25
25
25
25
...

Test 43

Verdict: ACCEPTED

input
50000
1 1 1 1 1 1 1 1000000000000 1 ...

correct output
27
2
2
2
2
...

user output
27
2
2
2
2
...

Test 44

Verdict: ACCEPTED

input
50000
1000000000000 1000000000000 10...

correct output
27
24
22
22
7
...

user output
27
24
22
22
7
...

Test 45

Verdict: ACCEPTED

input
50000
100000 100000 100000 100000 10...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 46

Verdict: ACCEPTED

input
50000
100000 100000 100000 100000 10...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 47

Verdict: ACCEPTED

input
50000
100000 100000 100000 100000 10...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 48

Verdict: ACCEPTED

input
50000
100000 100000 100000 100000 10...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 49

Verdict: ACCEPTED

input
50000
722 100000 100000 5989 100000 ...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 50

Verdict: ACCEPTED

input
50000
9132 100000 100000 100000 3077...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 51

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 10...

correct output
5
5
5
5
5
...

user output
5
5
5
5
5
...

Test 52

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 10...

correct output
5
2
2
2
2
...

user output
5
2
2
2
2
...

Test 53

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 10...

correct output
5
2
2
2
2
...

user output
5
2
2
2
2
...

Test 54

Verdict: ACCEPTED

input
100000
12649 85081 263931 249102 9739...

correct output
10
6
6
6
6
...

user output
10
6
6
6
6
...

Test 55

Verdict: ACCEPTED

input
100000
1000000000000 113645 43822 250...

correct output
10
3
3
3
3
...

user output
10
3
3
3
3
...

Test 56

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 10...

correct output
11
3
3
3
3
...

user output
11
3
3
3
3
...

Test 57

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 10...

correct output
5
5
5
5
5
...

user output
5
5
5
5
5
...

Test 58

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 10...

correct output
5
2
2
2
2
...

user output
5
2
2
2
2
...

Test 59

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 10...

correct output
5
5
5
5
2
...

user output
5
5
5
5
2
...

Test 60

Verdict: ACCEPTED

input
100000
41613 13664 63607 100000000000...

correct output
11
11
11
10
10
...

user output
11
11
11
10
10
...

Test 61

Verdict: ACCEPTED

input
100000
1000000000000 40692 1000000000...

correct output
11
2
2
2
2
...

user output
11
2
2
2
2
...

Test 62

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 10...

correct output
12
8
2
2
2
...

user output
12
8
2
2
2
...

Test 63

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 10...

correct output
5
5
5
5
5
...

user output
5
5
5
5
5
...

Test 64

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 10...

correct output
5
3
3
3
3
...

user output
5
3
3
3
3
...

Test 65

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 10...

correct output
5
5
3
3
3
...

user output
5
5
3
3
3
...

Test 66

Verdict: ACCEPTED

input
100000
1 1 1 1 1 1 1 1000000000000 1 ...

correct output
27
25
25
25
25
...

user output
27
25
25
25
25
...

Test 67

Verdict: ACCEPTED

input
100000
1 1 1000000000000 100000000000...

correct output
26
6
6
5
3
...

user output
26
6
6
5
3
...

Test 68

Verdict: ACCEPTED

input
100000
1000000000000 1000000000000 1 ...

correct output
26
5
5
5
5
...

user output
26
5
5
5
5
...

Test 69

Verdict: ACCEPTED

input
100000
279 1623 100000 100000 100000 ...

correct output
3
3
3
3
3
...

user output
3
3
3
3
3
...

Test 70

Verdict: ACCEPTED

input
100000
279 1623 100000 100000 100000 ...

correct output
3
3
3
3
3
...

user output
3
3
3
3
3
...

Test 71

Verdict: ACCEPTED

input
100000
279 1623 100000 100000 100000 ...

correct output
3
3
3
3
3
...

user output
3
3
3
3
3
...

Test 72

Verdict: ACCEPTED

input
100000
8815 100000 100000 100000 1000...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 73

Verdict: ACCEPTED

input
100000
20748 100000 100000 20644 1000...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 74

Verdict: ACCEPTED

input
100000
21734 6649 26577 100000 8081 5...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...