Submission #396389

#TimeUsernameProblemLanguageResultExecution timeMemory
396389peuchTeams (IOI15_teams)C++17
Compilation error
0 ms0 KiB
#include "teams.h"

#include <stdio.h>
#include <stdlib.h>

#include "teams.h"
#include<bits/stdc++.h>
using namespace std;
 
const int MAXN = 5e5 + 10;
 
int n;
pair<int, int> v[MAXN];
int bank[MAXN];
 
int m;
int k[MAXN];
 
vector<int> seg, e, d;
 
int create();
int copia(int pos);
int update(int pos, int ini, int fim, int id);
int query(int pos, int ini, int fim, int p, int q);
 
void init(int N, int A[], int B[]) {
	n = N;
	create();
	bank[0] = create();
	for(int i = 0; i < n; i++)
		v[i + 1] = make_pair(A[i], B[i]);
	sort(v + 1, v + 1 + n);
	for(int i = 1; i <= n; i++)
		bank[i] = update(bank[i - 1], 1, n, v[i].second);
}
 
int can(int M, int K[]) {
	m = M;
	for(int i = 0; i < m; i++)
		k[i + 1] = K[i];
	sort(k + 1, k + 1 + m);
	
	stack<pair<int, pair<int, int> > > pilha;
	pilha.push(make_pair(MAXN + 10, make_pair(0, 0)));
	
	int j = 0;
	
	for(int i = 1; i <= m; i++){
		
		while(j <= n && v[j].first <= k[i]) j++;
		j--;
		
		if(j <= 0) return 0;
		
		while(k[i] > pilha.top().first) pilha.pop();
		
		int sum = query(bank[j], 1, n, k[i], k[i]) - query(bank[pilha.top().second.first], 1, n, k[i], k[i]);
		
		int hmin = k[i] + 1;
		int hmax = k[i];
		
		while(!pilha.empty()){
			if(sum >= k[i]) break;
			
			int it = pilha.top().second.first;
			hmax = pilha.top().first;
			int diff = query(bank[j], 1, n, hmin, hmax) - query(bank[it], 1, n, hmin, hmax);
			if(diff + sum >= k[i]){
				int ini = hmin, fim = hmax;
				while(ini != fim){
					int mid = (ini + fim) >> 1;
					diff = query(bank[j], 1, n, hmin, mid) - query(bank[it], 1, n, hmin, mid);
					if(sum + diff >= k[i]) fim = mid;
					else ini = mid + 1;
				}
				hmax = ini;
				diff = query(bank[j], 1, n, hmin, hmax) - query(bank[it], 1, n, hmin, hmax);
				sum += diff;
				break;
			}
			else sum += diff + pilha.top().second.second, hmin = hmax + 1, pilha.pop();
		}
		if(sum < k[i]) return 0;
		pilha.push(make_pair(hmax, make_pair(j, sum - k[i])));
	}
	
	return 1;
}
 
int create(){
	seg.push_back(0);
	e.push_back(0);
	d.push_back(0);
	return seg.size() - 1;
}
 
int copia(int pos){
	seg.push_back(seg[pos]);
	e.push_back(e[pos]);
	d.push_back(d[pos]);
	return seg.size() - 1;
}
 
int update(int pos, int ini, int fim, int id){
	if(ini > id || fim < id) return pos;
	int newNode = copia(pos);
	if(ini == fim){
		seg[newNode]++;
		return newNode;
	}
	int mid = (ini + fim) >> 1;
	int aux = update(e[pos], ini, mid, id);
	e[newNode] = aux;
	aux = update(d[pos], mid + 1, fim, id);
	d[newNode] = aux;
	seg[newNode] = seg[e[newNode]] + seg[d[newNode]];
	return newNode;
}
 
int query(int pos, int ini, int fim, int p, int q){
	if(ini > q || fim < p) return 0;
	if(ini >= p && fim <= q) return seg[pos];
	int mid = (ini + fim) >> 1;
	return query(e[pos], ini, mid, p, q) + query(d[pos], mid + 1, fim, p, q);
}

int main() {
    int N;
    scanf("%d", &N);
    int *A = (int*)malloc(sizeof(int)*(unsigned int)N);
    int *B = (int*)malloc(sizeof(int)*(unsigned int)N);
    for (int i = 0; i < N; ++i) {
    	scanf("%d %d", &A[i], &B[i]);
    }
    init(N, A, B);
    int Q;
    scanf("%d", &Q);
    for (int i = 0; i < Q; ++i) {
    	int M;
    	scanf("%d", &M);
		int *K = (int*)malloc(sizeof(int)*(unsigned int)M);
    	for (int j = 0; j < M; ++j) {
    		scanf("%d", &K[j]);
    	}
    	printf("%d\n", can(M, K));
    }
    return 0;
}

Compilation message (stderr)

teams.cpp: In function 'int create()':
teams.cpp:94:20: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   94 |  return seg.size() - 1;
      |         ~~~~~~~~~~~^~~
teams.cpp: In function 'int copia(int)':
teams.cpp:101:20: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  101 |  return seg.size() - 1;
      |         ~~~~~~~~~~~^~~
teams.cpp: In function 'int main()':
teams.cpp:129:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  129 |     scanf("%d", &N);
      |     ~~~~~^~~~~~~~~~
teams.cpp:133:11: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  133 |      scanf("%d %d", &A[i], &B[i]);
      |      ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
teams.cpp:137:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  137 |     scanf("%d", &Q);
      |     ~~~~~^~~~~~~~~~
teams.cpp:140:11: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  140 |      scanf("%d", &M);
      |      ~~~~~^~~~~~~~~~
teams.cpp:143:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  143 |       scanf("%d", &K[j]);
      |       ~~~~~^~~~~~~~~~~~~
/tmp/ccw87JCS.o: In function `main':
grader.c:(.text.startup+0x0): multiple definition of `main'
/tmp/ccg4FtKC.o:teams.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status