제출 #102038

#제출 시각아이디문제언어결과실행 시간메모리
102038tincamateiSterilizing Spray (JOI15_sterilizing)C++14
100 / 100
925 ms54544 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAX_CF = 32;
const int MAX_N = 100000;

struct KBaseNumber {
	int cf[MAX_CF];

	KBaseNumber() {
		for(int i = 0; i < MAX_CF; ++i)
			cf[i] = 0;
	}

} aint[1+4*MAX_N];
int lazy[1+4*MAX_N];

void shift(KBaseNumber &target, int nr) {
	for(int i = 0; i < MAX_CF; ++i)
		if(i + nr < MAX_CF)
			target.cf[i] = target.cf[i + nr];
		else
			target.cf[i] = 0;
}

void calcSum(int k, KBaseNumber &target, KBaseNumber &a, KBaseNumber &b) {
	for(int i = 0; i < MAX_CF; ++i)
		target.cf[i] = a.cf[i] + b.cf[i];
}

void pushLazy(int nod, int l, int r) {
	shift(aint[nod], lazy[nod]);
	if(l < r) {
		lazy[2 * nod] += lazy[nod];
		lazy[2 * nod + 1] += lazy[nod];
	}
	lazy[nod] = 0;
}

void setNumber(int poz, int x, int k, int l, int r, int nod = 1) {
	pushLazy(nod, l, r);
	if(poz < l || r < poz) return;
	
	if(l == r) {
		for(int i = 0; i < MAX_CF; ++i) {
			aint[nod].cf[i] = x % k;
			x /= k;
		}
	} else {
		int mid = (l + r) / 2;

		setNumber(poz, x, k, l, mid, 2 * nod);
		setNumber(poz, x, k, mid + 1, r, 2 * nod + 1);
	
		calcSum(k, aint[nod], aint[2 * nod], aint[2 * nod + 1]);
	}
}

void setShift(int i, int j, int k, int l, int r, int nod = 1) {
	pushLazy(nod, l, r);
	if(j < l || r < i) return;

	if(i <= l && r <= j) {
		lazy[nod]++;
		pushLazy(nod, l, r);
	} else if(l < r) {
		int mid = (l + r) / 2;
		
		setShift(i, j, k, l, mid, 2 * nod);
		setShift(i, j, k, mid + 1, r, 2 * nod + 1);
		
		calcSum(k, aint[nod], aint[2 * nod], aint[2 * nod + 1]);
	}
}

KBaseNumber query(int i, int j, int k, int l, int r, int nod = 1) {
	pushLazy(nod, l, r);
	if(j < l || r < i) return KBaseNumber();
	
	if(i <= l && r <= j)
		return aint[nod];
	else {
		int mid = (l + r) / 2;
		KBaseNumber rez;
		KBaseNumber rezl = query(i, j, k, l, mid, 2 * nod),
		            rezr = query(i, j, k, mid + 1, r, 2 * nod + 1);

		calcSum(k, rez, rezl, rezr);
		return rez;
	}
}

long long getRealVal(KBaseNumber &x, int k) {
	long long rez = 0, p = 1;
	for(int i = 0; i < MAX_CF; ++i) {
		rez = rez + p * x.cf[i];
		p = p * k;
	}
	return rez;
}

int main() {
#ifdef HOME
	FILE *fin = fopen("input.in", "r");
	FILE *fout = fopen("output.out", "w");
#else
	FILE *fin = stdin;
	FILE *fout = stdout;
#endif

	int n, q, k;
	fscanf(fin, "%d%d%d", &n, &q, &k);
	
	for(int i = 1; i <= n; ++i) {
		int x;
		fscanf(fin, "%d", &x);
		setNumber(i, x, max(k, 2), 1, n);
	}

	for(int i = 0; i < q; ++i) {
		int t, x, y;
		fscanf(fin, "%d%d%d", &t, &x, &y);
		if(t == 1)
			setNumber(x, y, max(k, 2), 1, n, 1);
		else if(t == 2 && k > 1)
			setShift(x, y, k, 1, n, 1);
		else if(t == 3) {
			KBaseNumber rez = query(x, y, max(k, 2), 1, n, 1);
			fprintf(fout, "%lld\n", getRealVal(rez, max(k, 2)));
		}
	}

	fclose(fin);
	fclose(fout);
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

sterilizing.cpp: In function 'int main()':
sterilizing.cpp:113:8: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  fscanf(fin, "%d%d%d", &n, &q, &k);
  ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
sterilizing.cpp:117:9: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   fscanf(fin, "%d", &x);
   ~~~~~~^~~~~~~~~~~~~~~
sterilizing.cpp:123:9: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   fscanf(fin, "%d%d%d", &t, &x, &y);
   ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...