CSES - Harjoituskisa 14.1.2018 - Results
Submission details
Task:Pizzeriat
Sender:FSMnArmosta
Submission time:2018-01-14 21:28:02 +0200
Language:C++
Status:READY
Result:43
Feedback
groupverdictscore
#10
#2ACCEPTED43
#30
Test results
testverdicttimegroup
#10.05 s1details
#20.04 s1details
#30.06 s1details
#4ACCEPTED0.27 s2details
#5ACCEPTED0.26 s2details
#6ACCEPTED0.24 s2details
#70.27 s3details
#80.24 s3details
#90.24 s3details

Compiler report

input/code.cpp: In function 'void buildTrees(int)':
input/code.cpp:14:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < treeAsc[layer-1].size(); i++){
                    ^
input/code.cpp:18:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(i == treeAsc[layer-1].size())
          ^

Code

#include <iostream>
#include <vector>

using namespace std;

int n, q;

vector <int> treeAsc[100];
vector <int> treeDesc[100];

bool isRight(int x) { return x % 2; }

void buildTrees(int layer){
  for(int i = 0; i < treeAsc[layer-1].size(); i++){
    treeAsc[layer].push_back(treeAsc[layer-1][i]);
    treeDesc[layer].push_back(treeDesc[layer-1][i]);
    i++;
    if(i == treeAsc[layer-1].size())
      break;
    treeAsc[layer][i/2] = min(treeAsc[layer][i/2], treeAsc[layer-1][i]);
    treeDesc[layer][i/2] = min(treeDesc[layer][i/2], treeDesc[layer-1][i]);
  }
  if(treeAsc[layer].size() > 1)
    buildTrees(layer+1);
}

pair <int, int> childrenOf(int layer, int node){ return {(1 << layer)*node, (1 << layer)*(node+1)}; }

int queryAsc(int b, int layer, int node, bool up){
  pair<int, int> c = childrenOf(layer, node);
  if(layer == -1)
    return 0;
  if(c.second == b)
    return treeAsc[layer][node];
  if(up){
    if(c.second > b){
      return queryAsc(b, layer, node, false);
    }else{
      if(isRight(node))
        return min(treeAsc[layer][node], queryAsc(b, layer+1, (node/2)+1, true));
      else
        return queryAsc(b, layer+1, (node/2), true);
    }
  }else{
    if(c.second > b){
      return queryAsc(b, layer-1, node*2, false);
    }else{
      return min(treeAsc[layer][node], queryAsc(b, layer-1, (node+1)*2, false));
      }
  }
}


int queryDesc(int b, int layer, int node, bool up){
  pair<int, int> c = childrenOf(layer, node);
  if(layer == -1)
    return 0;
  if(c.second == b)
    return treeDesc[layer][node];
  if(up){
    if(c.second > b){
      return queryDesc(b, layer, node, false);
    }else{
      if(isRight(node))
        return min(treeDesc[layer][node], queryDesc(b, layer+1, (node/2)+1, true));
      else
        return queryDesc(b, layer+1, (node/2), true);
    }
  }else{
    if(c.second > b){
      return queryDesc(b, layer-1, node*2, false);
    }else{
      return min(treeDesc[layer][node], queryDesc(b, layer-1, (node+1)*2, false));
      }
  }
}

int main(){
  cin >> n >> q;
  for(int i = 0; i < n; i++){
    int t;
    cin >> t;
    treeAsc[0].push_back(t+i);
    treeDesc[0].push_back(t+(n-i)-1);
  }
  buildTrees(1);
  /*
  for(int i = 0; i < 17; i++){
    for(int k : treeAsc[i])
      cout << k << " ";
    cout << endl;
  }
  for(int i = 0; i < 17; i++){
    for(int k : treeDesc[i])
      cout << k << " ";
    cout << endl;
  }*/
  for(int w = 0; w < q; w++){
    char c;
    cin >> c;

      int k;
      cin >> k;
      k--;
      cout << min(queryAsc(n, 0, k, true)-k, queryDesc(k+1, 0, 0, true) - (n-k-1)) << endl;
  }
}

Test details

Test 1

Group: 1

Verdict:

input
1000 1000
720 271 760 576 363 23 368 995...

correct output
43
12
40
22
18
...

user output
7
33
14
33
12
...

Test 2

Group: 1

Verdict:

input
1000 1000
720 18 984 261 344 257 686 441...

correct output
10
20
27
37
73
...

user output
10
20
27
37
73
...

Test 3

Group: 1

Verdict:

input
1000 1000
120 764 890 848 949 59 894 916...

correct output
24
25
13
16
19
...

user output
24
43
22
25
13
...

Test 4

Group: 2

Verdict: ACCEPTED

input
100000 100000
11763 43585 3126 3787 79765 64...

correct output
284
143
346
203
157
...

user output
284
143
346
203
157
...

Test 5

Group: 2

Verdict: ACCEPTED

input
100000 100000
76947 78386 71190 65478 90345 ...

correct output
459
297
128
234
204
...

user output
459
297
128
234
204
...

Test 6

Group: 2

Verdict: ACCEPTED

input
100000 100000
39277 33504 98385 58115 28655 ...

correct output
234
221
156
455
78
...

user output
234
221
156
455
78
...

Test 7

Group: 3

Verdict:

input
100000 100000
46508 6952 22836 54480 91235 2...

correct output
427
409
352
39
388
...

user output
335
425
427
409
294
...

Test 8

Group: 3

Verdict:

input
100000 100000
15918 8771 36223 76330 39229 7...

correct output
316
387
435
330
446
...

user output
316
133
206
127
189
...

Test 9

Group: 3

Verdict:

input
100000 100000
87734 39225 78667 43704 17207 ...

correct output
228
83
176
428
273
...

user output
149
540
228
272
275
...