Submission #898004

#TimeUsernameProblemLanguageResultExecution timeMemory
898004Faisal_SaqibGame (IOI13_game)C++17
37 / 100
13050 ms8276 KiB
#include "game.h"
#include <iostream>
#include <numeric>
#include <set>
using namespace std;
const int N=2001;
struct SegmentTree
{
	long long gdc=0;
	int s,e;
	SegmentTree* next[2];
	SegmentTree(int l,int r)
	{
		s=l;
		e=r;
		next[0]=next[1]=NULL;
	}
	long long get(int& l,int& r)
	{
		if(e<l or r<s)
			return 0;
		if(l<=s and e<=r)
			return gdc;
		long long ans=0;
		if(next[0]!=NULL)
			ans=gcd(ans,next[0]->get(l,r));
		if(next[1]!=NULL)
			ans=gcd(ans,next[1]->get(l,r));
		return ans;
	}
	void Update(int& l,long long& val)
	{
		if(s==e)
		{
			if(s==l)
				gdc=val;
			return;
		}
		if(l<=((s+e)/2))
		{
			if(next[0]==NULL)
				next[0]=new SegmentTree(s,(s+e)/2);
			next[0]->Update(l,val);
		}
		else
		{
			if(next[1]==NULL)
				next[1]=new SegmentTree(1+((s+e)/2),e);
			next[1]->Update(l,val);
		}
		gdc=0;
		if(next[0]!=NULL)
			gdc=gcd(next[0]->gdc,gdc);
		if(next[1]!=NULL)
			gdc=gcd(next[1]->gdc,gdc);
	}
};
SegmentTree* st[N];
int R,C;
set<int> have;
void init(int r, int c)
{
	R=r;
	C=c;
}
void update(int p, int q, long long k)
{
	have.insert(p);
	if(st[p]==NULL)
		st[p]=new SegmentTree(0,C-1);
	st[p]->Update(q,k);
}
long long calculate(int P, int Q, int U, int V)
{
	long long ans=0;
	// for(;P<=U;P++)
	int sta=P-1;
	while(1)
	{
		auto it =have.upper_bound(sta);
		if(it==have.end() or (*it)>U)
			break;
		sta=*it;
		if(st[sta]!=NULL)
			ans=gcd(ans,st[sta]->get(Q,V));
		if(ans==1)
	  		return 1;
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...