Task: | Coins |
Sender: | Wave of Technology |
Submission time: | 2018-05-26 13:17:26 +0300 |
Language: | C++ |
Status: | READY |
Result: | ACCEPTED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.89 s | details |
#2 | ACCEPTED | 0.57 s | details |
#3 | ACCEPTED | 0.63 s | details |
#4 | ACCEPTED | 0.65 s | details |
#5 | ACCEPTED | 0.79 s | details |
Compiler report
input/code.cpp: In function 'int main()': input/code.cpp:142:8: warning: 'toleft' may be used uninitialized in this function [-Wmaybe-uninitialized] ll toleft; ^~~~~~
Code
#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll INF = 1000000000000000LL;struct STLP {vector<ll> t;int SZ;vector<ll> pending;vector<bool> ispending;STLP (int N) {SZ = 1;while (SZ<N) { SZ *= 2; }t= vector<ll> (2*SZ, 0);pending= vector<ll> (2*SZ, 0);ispending= vector<bool> (2*SZ, 0);}int rangesize (int i) const {int c=1;while ( i<SZ ) {c = 2*c;i *= 2;}return c;}void propagate_subtree(int i) {if (!ispending[i]) { return; }if (i<SZ) {set_to_subtree(2*i, pending[i]);set_to_subtree(2*i+1, pending[i]);}ispending[i] = false;pending[i] = 0;}void set_to_subtree(int i, ll val) {if (!ispending[i]) {pending[i] = val;} else {pending[i] += val;}t[i] += val;ispending[i] = true;}void fix_to_root(int i) {i/=2;while (i>0) {t[i] = max(t[2*i], t[2*i+1]);i /= 2;}}void propagate_from_root(int i) {for (int k=30; k>=0; k--) {if (i>>k)propagate_subtree(i>>k);}}void set_range(int a, int b, ll val) {a += SZ;b += SZ;propagate_from_root(a);propagate_from_root(b);int left = 0;int right = 0;while (b>=a) {if (a%2) {set_to_subtree(a, val);if (!left) left = a;a++;}if (!(b%2)) {set_to_subtree(b, val);if (!right) right = b;b--;}a /= 2;b /= 2;}fix_to_root(left);fix_to_root(right);}ll get_range(int a, int b) {ll res = -INF;a += SZ;b += SZ;propagate_from_root(a);propagate_from_root(b);while (b>=a) {if (a%2) {res = max(res, t[a]);a++;}if (!(b%2)) {res = max(res, t[b]);b--;}a /= 2;b /= 2;}return res;}};int main() {cin.tie(NULL);std::ios::sync_with_stdio(false);ll n;cin >> n;// STLP test(100);// test.set_range(0, 10, 10);// cout << "test: " << test.get_range(0, 10) << endl;STLP left(n+100);STLP right(n+100);for (int i=0; i<n; i++) {ll c, st;cin >> c >> st;ll toleft;if (st == 1) { toleft = 1; }if (st == 2) { toleft = -1; }left.set_range(0, c, toleft);right.set_range(0, c, -toleft);ll maxl = left.get_range(0, n+10);ll maxr = right.get_range(0, n+10);// cout << "TO: " << c << " " << toleft << endl;// cout << "MAX: " << maxl << " " << maxr << endl;if (maxl <= 0) {cout << '<' << endl;} else if (maxr <= 0) {cout << '>' << endl;} else {cout << '?' << endl;}}}
Test details
Test 1
Verdict: ACCEPTED
input |
---|
200000 175878 1 146174 1 4939 2 181388 1 ... |
correct output |
---|
> > > > > ... |
user output |
---|
> > > > > ... |
Test 2
Verdict: ACCEPTED
input |
---|
200000 1 2 2 1 3 2 4 1 ... |
correct output |
---|
< > < > < ... |
user output |
---|
< > < > < ... |
Test 3
Verdict: ACCEPTED
input |
---|
200000 1 1 2 1 3 1 4 1 ... |
correct output |
---|
> > > > > ... |
user output |
---|
> > > > > ... |
Test 4
Verdict: ACCEPTED
input |
---|
200000 1 1 2 1 3 1 4 1 ... |
correct output |
---|
> > > > > ... |
user output |
---|
> > > > > ... |
Test 5
Verdict: ACCEPTED
input |
---|
200000 188909 2 58944 1 26824 1 143263 2 ... |
correct output |
---|
< < ? < < ... |
user output |
---|
< < ? < < ... |