Submission #1301634

#TimeUsernameProblemLanguageResultExecution timeMemory
1301634Faisal_SaqibGaraža (COCI17_garaza)C++20
40 / 160
4094 ms1840 KiB
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],seg[4*N],n,q;
void update(int &i,int &v,int l=1,int r=n,int d=1)
{
	if(i<l or r<i)return;
	if(l==r)
	{
		seg[d]=a[i]=v;
		return;
	}
	int m=(l+r)>>1,cl=d<<1,cr=cl|1;
	update(i,v,l,m,cl);
	update(i,v,m+1,r,cr);
	seg[d]=__gcd(seg[cl],seg[cr]);
}
int get(int &ql,int &qr,int l=1,int r=n,int d=1)
{
	if(qr<l or r<ql) return 0;
	if(ql<=l and r<=qr) return seg[d];
	int m=(l+r)>>1,cl=d<<1,cr=cl|1;
	return __gcd(get(ql,qr,l,m,cl),get(ql,qr,m+1,r,cr));
}
int main()
{
	ios::sync_with_stdio(0);
	cout.tie(0);
	cin.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		update(i,a[i]);
	}
	while(q--)
	{
		int t;
		cin>>t;
		if(t==1) // O(lg n)
		{
			int x,v;
			cin>>x>>v;
			update(x,v);
		}
		else// O(n lg^2 n)
		{
			int l,r;
			cin>>l>>r;
			int k=r;
			long long ans=0;
			for(int i=r;i>=l;i--)
			{
				while(get(i,k)==1)k--;
				ans+=k-i+1;
			}
			cout<<ans<<endl;
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...