Submission #82359

#TimeUsernameProblemLanguageResultExecution timeMemory
82359farukkastamonudaGaraža (COCI17_garaza)C++14
160 / 160
1376 ms55356 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define lo long long 
#define inf 1000000000000000000
#define md 1000000007
#define li 100005
#define mp make_pair
#define pb push_back
#define mid (start+end)/2
using namespace std;
int n,q,A[li];
struct SEG{
	int bas,son;
	lo int res;
	int presiz,sufsiz;
	vector< pair<int,int> > pre,suf;
}tree[li*4];
SEG merge(SEG A,SEG B){
	SEG res1;
	res1.bas=A.bas;
	res1.son=B.son;
	res1.res=A.res+B.res;
	int last=-1;
	int now=(int)A.suf.size()-1;
	int totszB=0;
	while(now+1){
		pair<int,int> suf_el=A.suf[now];
		now--;
		while(last+1<(int)B.pre.size() && __gcd(suf_el.fi,B.pre[last+1].fi)>1){
			totszB+=B.pre[last+1].se;
			last++;
		}
		res1.res+=1ll*suf_el.se*totszB;
	}
	if(A.presiz==A.son-A.bas+1){
		int last=-1;
		while(last+1<(int)B.pre.size() && __gcd(A.pre.back().fi,B.pre[last+1].fi)){
			int tut=__gcd(A.pre.back().fi,B.pre[last+1].fi);
			last++;
			if(tut==A.pre.back().fi){
				A.pre.back().se+=B.pre[last].se;
			}
			else{
				A.pre.pb(mp(tut,B.pre[last].se));
			}
		}
	}
	if(B.sufsiz==B.son-B.bas+1){
		int last=-1;
		while(last+1<(int)A.suf.size() && __gcd(A.suf[last+1].fi,B.suf.back().fi)>1){
			last++;
			int tut=__gcd(A.suf[last].fi,B.suf.back().fi);
			if(tut==B.suf.back().fi){
				B.suf.back().se+=A.suf[last].se;
			}
			else{
				B.suf.pb(mp(tut,A.suf[last].se));
			}
		}
	}
	res1.pre=A.pre;
	res1.suf=B.suf;
	res1.presiz=res1.sufsiz=0;
	for(int i=0;i<(int)A.pre.size();i++) res1.presiz+=A.pre[i].se;
	for(int i=0;i<(int)B.suf.size();i++) res1.sufsiz+=B.suf[i].se;
	return res1;
}
void build(int node,int start,int end){
	if(start==end){
		tree[node].bas=start;
		tree[node].son=end;
		if(A[start]>1){
			tree[node].pre.pb(mp(A[start],1));
			tree[node].suf.pb(mp(A[start],1));
			tree[node].presiz=tree[node].sufsiz=tree[node].res=1;
		}
		return ;
	}
	build(node*2,start,mid),build(node*2+1,mid+1,end);
	tree[node]=merge(tree[node*2],tree[node*2+1]);
}
SEG query(int node,int start,int end,int l,int r){
	if(start>=l && end<=r) return tree[node];
	if(mid>=l){
		if(mid+1<=r)
			return merge(query(node*2,start,mid,l,r),query(node*2+1,mid+1,end,l,r));
		else
			return query(node*2,start,mid,l,r);
	}
	else{
		return query(node*2+1,mid+1,end,l,r);
	}
}
void update(int node,int start,int end,int l,int r,int val){
	if(start>end || start>r || end<l) return ;
	if(start>=l && end<=r){
		tree[node].pre.clear();
		tree[node].suf.clear();
		tree[node].res=tree[node].presiz=tree[node].sufsiz=0;
		if(val>1){
			tree[node].pre.pb(mp(val,1));
			tree[node].suf.pb(mp(val,1));
			tree[node].presiz=tree[node].sufsiz=tree[node].res=1;
		}
		return ;
	}
	update(node*2,start,mid,l,r,val),update(node*2+1,mid+1,end,l,r,val);
	tree[node]=merge(tree[node*2],tree[node*2+1]);
}
int main(){
	scanf("%d %d",&n,&q);
	for(int i=1;i<=n;i++) scanf("%d",&A[i]);
	build(1,1,n);
	while(q--){
		int ty,num1,num2;
		scanf("%d %d %d",&ty,&num1,&num2);
		if(ty==1){
			update(1,1,n,num1,num1,num2);
		}
		else{
			lo int yaz=query(1,1,n,num1,num2).res;
			printf("%lld\n",yaz);
		}
	}
	return 0;
}

Compilation message (stderr)

garaza.cpp: In function 'int main()':
garaza.cpp:112:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&n,&q);
  ~~~~~^~~~~~~~~~~~~~~
garaza.cpp:113:29: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1;i<=n;i++) scanf("%d",&A[i]);
                        ~~~~~^~~~~~~~~~~~
garaza.cpp:117:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d",&ty,&num1,&num2);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...