Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <iostream>
- #include <vector>
- #define N 100001
- using namespace std;
- ifstream fin("investitie.in");
- ofstream fout("investitie.out");
- int a[N];
- bool b[N];
- pair<int , int> c[N];
- vector<int> v[N];
- vector<long long>s[N];
- long long Calcul(int poz, int nr)
- {
- int n, ind;
- long long ras=0;
- ind=c[poz].first;
- poz=c[poz].second;
- n=v[ind].size()-1;
- ras=s[ind].back()*(nr/n);
- nr%=n;
- if(nr>0)
- {
- ras+=s[ind][min(poz+nr,n)]-s[ind][poz];
- nr-=min(poz+nr,n)-poz;
- }
- if(nr>0)ras+=s[ind][nr];
- return ras;
- }
- int main()
- {
- int n,m,i,j,zi,zf, cl, cr,q;
- long long val, ras;
- fin>>n>>m;
- for(i=1;i<=n;i++)fin>>a[i];
- int nr=0;
- for(i=1;i<=n;i++)
- if(b[i]==0)
- {
- nr++;
- v[nr].push_back(0);
- for(j=i; b[j]==0; j=a[j])
- {
- v[nr].push_back(j);
- c[j]={nr,v[nr].size()-1};
- b[j]=1;
- }
- }
- for(i=1;i<=nr;i++)
- {
- s[i].push_back(0);
- for(j=1;j<v[i].size();++j)
- {
- val=s[i].back();
- s[i].push_back(val+v[i][j]);
- }
- }
- fin>>q;
- for(i=1;i<=q;i++)
- {
- fin>>zi>>zf>>cl>>cr;
- ras=0;
- for(j=cl;j<=cr;j++)
- ras+=Calcul(j,zf)-Calcul(j,zi-1);
- fout<<ras<<"\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement